[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