[Rcpp-devel] Rcpp function variable which is given as argument

Dirk Eddelbuettel edd at debian.org
Wed Jul 9 12:35:22 CEST 2014


On 9 July 2014 at 12:21, Mario Deng wrote:
| Hello everyone,
| 
| I am observing a, to me, strange behaviour. Rcpp seems to modify my variable, which is given as argument. Here is my code:
| 
| In R am am running:
| 
| Rcpp::sourceCpp("~/.../VectorList/VectorList.cpp")
| foo=matrix(runif(52), ncol=4)
| colnames(foo)=paste("X",1:ncol(foo),sep="")
| rownames(foo)=paste("Y",1:nrow(foo),sep="")

Creates foo.
| 
| Until here foo looks like:
| > foo
|            X1        X2        X3         X4
| Y1  0.2786725 0.4024807 0.4968645 0.80620023
| Y2  0.6441421 0.3540515 0.7312126 0.03784105
| Y3  0.9090161 0.4328849 0.6004133 0.69923867
| Y4  0.2553254 0.5678732 0.7917617 0.25911206
| Y5  0.2667057 0.3320151 0.7481575 0.90253673
| Y6  0.2635481 0.4849927 0.9537019 0.73662740
| Y7  0.4501414 0.9451928 0.8241006 0.54619146
| Y8  0.9177439 0.9556434 0.4024955 0.05961032
| Y9  0.3763357 0.7825898 0.1443202 0.27215527
| Y10 0.5892217 0.6663081 0.3577415 0.69333984
| Y11 0.9915392 0.4184379 0.6896782 0.22941638
| Y12 0.5609363 0.6079867 0.7183952 0.24935215
| Y13 0.8792352 0.8951102 0.4679093 0.19242862
| 
| After running createVectorList(foo) (which is a Rcpp function) foo looks like (it's sorted):

Calls function with foo, so now function has access to foo.
 
| > foo
|            X1        X2        X3         X4
| Y1  0.2553254 0.3320151 0.1443202 0.03784105
| Y2  0.2635481 0.3540515 0.3577415 0.05961032
| Y3  0.2667057 0.4024807 0.4024955 0.19242862
| Y4  0.2786725 0.4184379 0.4679093 0.22941638
| Y5  0.3763357 0.4328849 0.4968645 0.24935215
| Y6  0.4501414 0.4849927 0.6004133 0.25911206
| Y7  0.5609363 0.5678732 0.6896782 0.27215527
| Y8  0.5892217 0.6079867 0.7183952 0.54619146
| Y9  0.6441421 0.6663081 0.7312126 0.69333984
| Y10 0.8792352 0.7825898 0.7481575 0.69923867
| Y11 0.9090161 0.8951102 0.7917617 0.73662740
| Y12 0.9177439 0.9451928 0.8241006 0.80620023
| Y13 0.9915392 0.9556434 0.9537019 0.90253673
| 
| I don't perform any allocation for foo. Why is this Rcpp function (shown below) modifying foo?
| Here is the code I am behind createVectorList()
| 
| #include <Rcpp.h>
| using namespace Rcpp;
| 
| // [[Rcpp::export]]
| List createVectorList(NumericMatrix df) {
|   CharacterVector rownames = VECTOR_ELT(df.attr("dimnames"), 0);
|   CharacterVector colnames = VECTOR_ELT(df.attr("dimnames"), 1);
|   // Check Dimnames
|   if (df.nrow() != rownames.size() ) { 
|     throw Rcpp::exception("Dimensions and corrosponding names differ in length");
|   }
|   List vectorList(df.ncol());
|   for(int i = 0; i < df.ncol(); i++){
|     NumericVector sorted_vec = df(_,i);
|     sorted_vec=sorted_vec.sort();

Sorts the variables in foo.

|     NumericVector one_col = df(_,i);
|     df(_,i)=sorted_vec;
|     IntegerVector matched;
|     matched = match(sorted_vec, one_col);
|     sorted_vec.attr("names")=rownames[matched-1];
|     vectorList[i]=sorted_vec;
|   }
|   vectorList.attr("names") = colnames;
|   CharacterVector classIDs = CharacterVector::create("VectorList", "list");
|   vectorList.attr("class") = classIDs;
|   return vectorList;
| }
| 
| 
| Is there anything I am missing? I mean, how can Rcpp even access my variables?!

Because you pass them in.

A variable passed via .Call is a SEXP where P stands for pointer.

If you want to work on __distinct copies__ you need to call clone().  Search
the list archives, or read my book on Rcpp.  This has all been discussed before.

Cheers, Dirk
 
| With all the best,
| 
| Mario
| __
| MD
| mariodeng at googlemail.com
| 
| 
| 
| 
| _______________________________________________
| 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

-- 
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org


More information about the Rcpp-devel mailing list