On Thu, 14 Apr 2005, Simon Urbanek wrote:

On Apr 14, 2005, at 6:01 PM, Tib wrote:

from the examples of Writing R Extensions,  I see one still has to
declare the size of arrays by NEW_NUMERIC(n) or
allocVector(REALSXP,n), how can I extend arrays?

AFAIR you cannot extend vectors - it's like in C, you cannot extend allocated memory without changing the pointer (i.g.). In order to get a vector of a different size, you have to allocate a new one and copy the common contents. If you are concerned about efficiency, why don't you just use arbitrary large vectors and pass along the number of used elements? Then you can easily add elements without re-allocating and just return the number of elements used after the operation. That way you can control the probability of having to allocate a new vector, possibly making it zero.

That's not a particularly good idea, as R keeps the length in the vector.
There is a way to do this, lengthgets(). That shortens vectors in one case, and reallocates and copies contents if extending. Quite a lot of internal code does use long vectors and call lengthgets() at the end to shorten them to the right size. (Other code duplicates that in lengthgets.)


As the name implies, this is the internal form of length(x) <- value.

Yes, it does change the pointer because it creates (potentially a new object). But since an R object is just a few parameters (e.g. type and length) and a pointer, you could in fact extend an R vector `in place'.

--
Brian D. Ripley,                  [EMAIL PROTECTED]
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

______________________________________________
R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to