From murdoch.duncan at gmail.com  Mon Apr  1 19:54:31 2013
From: murdoch.duncan at gmail.com (Duncan Murdoch)
Date: Mon, 01 Apr 2013 13:54:31 -0400
Subject: [Rd] Timing of SET_VECTOR_ELT
In-Reply-To: <5159BF6E.5050709@mayo.edu>
References: <5159BF6E.5050709@mayo.edu>
Message-ID: <5159C9D7.7080808@gmail.com>

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



[Rd] Timing of SET_VECTOR_ELT
Duncan Murdoch