[Rcpp-devel] Some questions regarding internals of Rcpp objects

Ulrich Bodenhofer bodenhofer at bioinf.jku.at
Fri Aug 5 11:45:55 CEST 2011


Dear list members,

I have started developing a package using the latest version of Rcpp 
just recently, so I am more or less an Rcpp newbie. Since I am not 
sufficiently proficient in advanced C++ (and admittedly too lazy too) to 
analyze the Rcpp source code, I have some questions regarding what 
actually happens inside Rcpp. Let me bother you with an example:

RcppExport SEXP test(SEXP mat)
{
BEGIN_RCPP
     Rcpp::NumericMatrix matC(mat);
     Rcpp::NumericMatrix matD(mat);

     matC(1, 1) = 1;
     matD(1, 1) = -matD(1, 1);

     return(matC);
END_RCPP
}

If I call this function on some matrix, then the function returns the 
input matrix with its element [2, 2] set to 1, but that's all. The 
change in matD only seems to have an effect on the local copy matD. If I 
replace "return(matC)" by "return(matD)", then the function returns the 
input matrix with the sign of its element [2, 2] inverted, so the change 
in matC has no effect. That Rcpp creates local copies, i.e. that matC 
and matD are independent objects each holding local copies of the 
argument mat, would perfectly explain these results. Previously, 
however, I thought Rcpp would only wrap an R/SEXP object into an Rcpp 
object without making a copy. If it was so, no matter whether the 
function returns matC or matD, the function would return the input 
matrix with -1 on position [2, 2]. Did I get this point wrong? I suppose 
it would save time and memory not to create a copy, in particular, since 
arguments to functions are local copies already. Is there a way to avoid 
copying?

A related question is what the "=" operator does. Does

     Rcpp::NumericVector x = ...;

create a copy or is it only a pointer that is assigned?

My final question concerns the "longevity" of Rcpp objects. Suppose I do 
the following:

     {
         Rcpp::NumericVector vec(10);
         double *p = vec.begin();
     }

Can I use *p outside this block or is the pointer killed along with the 
variable vec after the block is closed? According to my limited 
knowledge, I would assume that it is only the reference vec that is not 
available outside the block, but that the corresponding R object still 
exists and will be deleted by the R garbage collector only after the 
whole function has terminated.

Any help is gratefully appreciated! I am sorry if these are stupid 
questions or if any of them have been discussed previously.

Thanks and best regards,
Ulrich

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20110805/18463a4d/attachment.htm>


More information about the Rcpp-devel mailing list