[R] how to bind lists recursively

Patrick Burns pburns at pburns.seanet.com
Wed May 28 11:20:40 CEST 2008


Bill.Venables at csiro.au wrote:
> This is somewhat subtle.
>
> Rolf's solution (here corrected to...)
>
> a <- list()
> for(i in 0:10000) a[[i+1]] <- i
>
> is the best of the loop solutions (or at least the best I know of).  The
>   

But Bill does know a better way -- it just slipped his mind.

 > system.time({ a <- list(); for(i in 0:10000) a[[i+1]] <- i})
   user  system elapsed
   1.14    0.00    1.16
 > system.time({ a <- vector("list", 10001); for(i in 0:10000) a[[i+1]] 
<- i})
   user  system elapsed
   0.11    0.00    0.12

The lesson is to create the object to be the final length
rather than growing the object.

Patrick Burns
patrick at burns-stat.com
+44 (0)20 8525 0696
http://www.burns-stat.com
(home of S Poetry and "A Guide for the Unwilling S User")

> apparently similar
>
> a <- list(0)
> for(i in 1:10000) a <- c(a, list(i))
>
> will take a lot longer, although the result is the same.  For example:
>
>   
>> system.time({
>>     
>     a <- list()
>     for(i in 0:10000) a[[i+1]] <- i
>     })
>    user  system elapsed 
>    0.59    0.00    0.59 
>   
>> system.time({
>>     
>     a <- list(0)
>     for(i in 1:10000) a <- c(a, list(i))
>     })
>    user  system elapsed 
>    6.87    0.00    6.89 
>   
>
> That's a factor of about 11 times as long.  The best of the lot is
>
> a <- as.list(0:10000)
>
> of course, but this has problems with generalisation, (which everyone
> suspects is going to be needed here...).
>
> Bill Venables.  
>
>
>
> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org]
> On Behalf Of Rolf Turner
> Sent: Wednesday, 28 May 2008 1:02 PM
> To: Daniel Yang
> Cc: r-help at r-project.org
> Subject: Re: [R] how to bind lists recursively
>
>
> On 28/05/2008, at 2:43 PM, Daniel Yang wrote:
>
>   
>> Dear all,
>>
>> I want to create a list that contains 0,1,2,3, ..., 10000 as its  
>> elements. I used the following code, which apparently doesn't work  
>> very well.
>>
>> a <- 0
>> for(i in 1:10000) {
>>    a <- list(a, i)
>> }
>>
>> The result is not what I wanted. So how to create the bind lists  
>> recursively so that the last element would be the newly added one  
>> while the previous elements all remain the same?
>>     
>
> a <- list()
> for(i in 1:10000) a[[i]] <- i
>
> (The word ``bind'' is inappropriate.)
>
> 	cheers,
>
> 		Rolf Turner
>
> ######################################################################
> Attention:\ This e-mail message is privileged and confid...{{dropped:9}}
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
>
>



More information about the R-help mailing list