Dear Dirk,

Thanks for your detailed comments!

Regarding the first question: as I wrote, I was actually assuming that Rcpp would not make deep copies.

[...]
See this variant:

R>  fun<- cxxfunction(signature(mat="numeric"), plugin="Rcpp", body='
+      Rcpp::NumericMatrix matC(mat);
+      Rcpp::NumericMatrix matD(mat);
+
+      matC(1, 1) = 1;
+      matD(1, 1) = -matD(1, 1);
+
+      return(Rcpp::List::create(Rcpp::Named("C")=matC,
+                                Rcpp::Named("D")=matD));
+ ');
R>  fun(matrix(42,2,2))
$C
      [,1] [,2]
[1,]   42   42
[2,]   42   -1

$D
      [,1] [,2]
[1,]   42   42
[2,]   42   -1

R>

So C and D are really the same thing.

Fine. If so, I actually wonder what's wrong with my function

  RcppExport SEXP test(SEXP mat)
  {
  BEGIN_RCPP
      Rcpp::NumericMatrix matC(mat);
      Rcpp::NumericMatrix matD(mat);

      matC(1, 1) = 1;
      matD(1, 1) = -matD(1, 1);

      return(matC);
  END_RCPP
  }

I tried it on matrix(42, 2, 2) too and, surprise, it returns -1 as element [2, 2] - just as in your example. So far so good. However, if I apply it to matrix(1:16, 4, 4) (and this is an example similar to the one I tried before, which actually made me write this question to the list), I get the following (note the 1 at [2, 2]):

test(matrix(1:16, 4, 4))
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    1   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16


If it's not the copying, what else is wrong here? I actually don't get it. Very mysterious!

Regarding my third question, I have to admit that my example was flawed. Stupid me! I wanted to write something like the following:

  double *p;

  {
     Rcpp::NumericVector vec(10);
     p = vec.begin();
  }

As I understand your reply, I could use p outside the block, as it still points to the data inside the R object created inside the block, right?

Thanks again for your very helpful answers!

Best regards,
Ulrich
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to