[Rcpp-devel] Some questions regarding internals of Rcpp objects

Ulrich Bodenhofer bodenhofer at bioinf.jku.at
Sat Aug 6 06:40:01 CEST 2011


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


More information about the Rcpp-devel mailing list