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

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

Reply via email to