[R] Best way to preallocate numeric NA array?

Rob Steele freenx.10.robsteele at xoxy.net
Thu Nov 26 17:41:09 CET 2009


Douglas Bates wrote:
> On Thu, Nov 26, 2009 at 10:03 AM, Rob Steele
> <freenx.10.robsteele at xoxy.net> wrote:
>> These are the ways that occur to me.
>>
>> ## This produces a logical vector, which will get converted to a numeric
>> ## vector the first time a number is assigned to it.  That seems
>> ## wasteful.
>> x <- rep(NA, n)
>>
>> ## This does the conversion ahead of time but it's still creating a
>> ## logical vector first, which seems wasteful.
>> x <- as.numeric(rep(NA, n))
>>
>> ## This avoids type conversion but still involves two assignments for
>> ## each element in the vector.
>> x <- numeric(n)
>> x[] <- NA
>>
>> ## This seems reasonable.
>> x <- rep(as.numeric(NA), n)
>>
>> Comments?
> 
> My intuition would be to go with the third method (allocate a numeric
> vector then assign NA to its contents) but I haven't tested the
> different.  In fact, it would be difficult to see differences in, for
> example, execution time unless n was very large.
> 
> This brings up a different question which is, why do you want to
> consider this?  Are you striving for readability, for speed, for low
> memory footprint, for "efficiency" in some other way?  When we were
> programming in S on machines with 1 mips processors and a couple of
> megabytes of memory, such considerations were important.  I'm not sure
> they are quite as important now.
> 

Thanks--good questions.  For any code, I'd order the requirements like this:

1) Correct
2) Readable
3) Space efficient
4) Time efficient

Compromises are sometimes necessary.  R is such an odd language that it
really helps readability to settle on easily recognizable idioms.
That's true in any language where there's more than one way to do things
but I find it especially true in R.  I agree that the efficiency of this
operation only matters with very large vectors or very many repetitions.




More information about the R-help mailing list