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

Romain Francois romain at r-enthusiasts.com
Sat Aug 6 13:12:35 CEST 2011


Le 06/08/11 06:40, Ulrich Bodenhofer a écrit :
> 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

No mystery.

 > typeof(matrix(1:16, 4, 4))
[1] "integer"

So NumericMatrix has no choice but to coerce your data to numeric, so 
matC and matD are two new objects, different from mat

> 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?

very dangerous. vec will be garbage collected at some time you don't 
control. don't do that.

> Thanks again for your very helpful answers!
>
> Best regards,
> Ulrich
> _______________________________________________
> 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
>


-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
http://romain-francois.com
|- http://bit.ly/lJoWbH : Montpellier Comédie Club - Juin 2011
|- http://bit.ly/kaSV6U : Stand up set at Up The Creek
`- http://bit.ly/hdKhCy : Rcpp article in JSS




More information about the Rcpp-devel mailing list