[Rcpp-devel] Forcing a shallow versus deep copy

Dirk Eddelbuettel edd at debian.org
Fri Jul 12 00:43:15 CEST 2013


On 11 July 2013 at 21:34, Changi Han wrote:
| I am sure there are better ways to achieve the goal. I would suggest that these
| two be similar if possible. I think the naive expectation is for them to be
| consistent.
| 
| // [[Rcpp::export]]
| stuff function(Rcpp::stuff) {
| }
| 
| // [[Rcpp::export]]
| stuff function(arma::stuff) {
| }
| 
| Thank you again. Cheers.

This is an open project. Send a patch, or provide funds for us to do it for
you.  This isn't a restaurant where you order service.

Dirk
 
 
| On Thu, Jul 11, 2013 at 9:22 PM, <romain at r-enthusiasts.com> wrote:
| 
| 
|     Hello,
| 
|     This comes up every now and then, I think we can find a syntax to initiate
|     an arma::mat that would allow what you want.
| 
|     It is not likely it will come via attributes. The idea is to keep them
|     simple. The solutions I see below would eventually lead to clutter, and we
|     are heading in the less clutter direction.
| 
|     I'll think about it and propose something.
| 
|     Romain
| 
|     Le 2013-07-11 14:32, Changi Han a écrit :
| 
|         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
| 
| 
|     _______________________________________________
|     Rcpp-devel mailing list
|     Rcpp-devel at lists.r-forge.r-project.org
|     https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
| 
| 
| 
| ----------------------------------------------------------------------
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com


More information about the Rcpp-devel mailing list