[Rcpp-devel] Forcing a shallow versus deep copy

Changi Han changi.han.wen at gmail.com
Thu Jul 11 14:32:26 CEST 2013


Hello,

I think I (superficially) understand the difference between:

// [[Rcpp::export]]
double sum1(Rcpp::NumericMatrix M) {
    arma::mat A(M.begin(), M.rows(), M.cols(), false);
    return sum(sum(A));
}


// [[Rcpp::export]]
double sum2(arma::mat A) {
    return sum(sum(A));
}

Partly out of laziness, partly because sum2 is more elegant, and partly to
avoid namespace pollution, I was wondering if there is a way to "force" a
"shallow" copy in sum2.

If not, then may I submit a low priority feature request. An attribute?
Some thing like:

// [[Rcpp::export]]
double sum2(arma::mat A) {
    // [[ Rcpp::shallow ( A ) ]]
    return sum(sum(A));
}

Or (akin to C++11 generalized attributes)

// [[Rcpp::export]] { [[ Rcpp::shallow ( A ) ]] }
double sum2(arma::mat A) {
    return sum(sum(A));
}

An alternative is to have an argument in sourceCpp that takes a list/vector
of objects that are to be shallow or deep copied.

For example in sum1, if M is changed within the function before casting to
the arma::mat, then might be cleaner to add M to a list/vector of objects
to be deep copied rather than cloning M within sum1: leads to one fewer
variable name.

Just a thought. I can certainly live with the additional step. As always,
thanks for all the Rcpp goodness.

Cheers,
Changi Han
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20130711/95472ae4/attachment.html>


More information about the Rcpp-devel mailing list