[Rd] Timing of SET_VECTOR_ELT
Simon Urbanek
simon.urbanek at r-project.org
Mon Apr 1 19:44:51 CEST 2013
On Apr 1, 2013, at 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're assigning a pointer, so it doesn't matter.
FWIW, you can avoid all the PROTECTion mess if you alloc+assign, e.g.
SEXP rlist = PROTECT(mknamed(VECSXP, outnames));
SEXP means = SET_VECTOR_ELT(rlist, 0, allocVector(REALSXP, nvar));
...
since you only need to protect the parent object.
Cheers,
Simon
More information about the R-devel
mailing list