[Rd] Timing of SET_VECTOR_ELT

Duncan Murdoch murdoch.duncan at gmail.com
Mon Apr 1 19:54:31 CEST 2013


On 01/04/2013 1:10 PM, Terry Therneau wrote:
> Assume a C program invoked by .Call, that returns a list.
>
>    Near the top of the program we allocate space for all the list elements. (It is my habit
> to use "xyz2" for the name of the R object and "xyz" for the pointer to its contents.)
>
>       PROTECT(means2 = allocVector(REALSXP, nvar));
>       means = REAL(means2);
>       PROTECT(u2 = allocVector(REALSXP, nvar));
>       u = REAL(u2);
>       PROTECT(loglik2 = allocVector(REALSXP, 2));
>       loglik = REAL(loglik2);
>
>       PROTECT(rlist = mknamed(VECSXP, outnames));
>
> Can I assign the individual elements into rlist using SET_VECTOR_ELT at this point, or do
> I need to wait until the end of the program, after I've filled in means[i], u[i], etc.?  I
> likely depends on whether I'm assigning a pointer or a copy.

You could assign them at this point, but only if you're sure the 
pointers won't change.   You might change the pointers if you reallocate 
a vector to lengthen it or shorten it, for example. Generally speaking 
this won't happen behind your back, but you might forget and do it in 
the future when you modify the function, so I'd say it's safer to wait 
until the last minute to put the pointers in the list.

Duncan Murdoch



More information about the R-devel mailing list