[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