[Rcpp-devel] How to modifying the elements of a list in the global environment?

Christian Gunning xian at unm.edu
Fri Oct 19 10:06:14 CEST 2012

>> ### For the Rcpp part, set aside working space in the global environment
>> workspace <- lapply(1:K, function(k) matrix(0.0, N, M))
> Then I try to access the matrices in the 'workspace' list and modify them, but so far I have had no success. The first attemp, bolow, does not compile...
>> code_f <- '
> +     Rcpp::NumericMatrix cpp_x(x);

If you're familiar with R and new to C++, understanding how C++
clone() works will help. For example, to use a single matrix as a
"working matrix" (if you write over it each iteration),  define the
working matrix (workmat) in R.   You can pass that object to the C++
function in two different ways:

Rcpp::NumericMatrix workmat(workmat_);  // modifies existing R
structure in-place, no extra copy made
Rcpp::NumericMatrix workmat( clone(workmat_) );  // allocate new
memory to make a "deep copy"

Assuming N & M are constant, then you can make a single matrix in R
and modify it in-place without any cost of extra copying.  If you
*want* and extra copy, you use clone().  R *always* makes a new copy
-- this is one of the "big divides" between R and C++,
pass-by-reference versus pass-by-value (clone).

For examples, see
A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama!

More information about the Rcpp-devel mailing list