[Rcpp-devel] Persistence of C++ changes in R.

Douglas Bates bates at stat.wisc.edu
Thu Dec 23 13:44:56 CET 2010


On Thu, Dec 23, 2010 at 2:38 AM, Cedric Ginestet
<c.ginestet05 at googlemail.com> wrote:
> Thanks Douglas and Dirk,
>
> Just to answer Douglas: No, I didn't get an error message when compiling the
> cxx.function that I posted yesterday. Regarding the use of clone, is it more
> time consuming to use this particular command?

Yes,  The purpose of clone is to make a copy of the R object so it
uses more time and more memory than not copying.  If the argument is
not going to be modified in the C++ function then there is no need to
clone it.  If you will modify it then you should clone it in order to
preserve the functional language semantics of R.

> Cheers,
>
> Here are the corrected codes. It now works fine, or rather as I expected
> from my experience with R.
> ###############################################
> D <- matrix(rnorm(4),2,2)
> src3 <- '
>  NumericMatrix xD(clone(D));
>  xD(0,0) = 100.0;
> return xD;
> '
> passRef <- cxxfunction(signature(D="matrix"),body=src3,plugin="Rcpp")
> passRef(D); D
> ##############################################
>
>
>
> On 22/12/10 18:32, Douglas Bates wrote:
>>
>> On Wed, Dec 22, 2010 at 12:08 PM, Cedric Ginestet
>> <c.ginestet05 at googlemail.com>  wrote:
>>>
>>> Dear Rcpp Experts,
>>>
>>> I have encountered two issues when modifying an object within C++
>>> function.
>>> See the code below:
>>>
>>> ##########################################
>>> library(inline); library(Rcpp)
>>> D<- matrix(rnorm(4),2,2)
>>> src3<- '
>>>   NumericMatrix xD(D);
>>>   xD[1,1] = 100.0;
>>> return xD;
>>> '
>>> passRef<- cxxfunction(signature(D="matrix"),body=src3,plugin="Rcpp")
>>> passRef(D); D
>>> ###########################################
>>>
>>>  From which I get the following:
>>>            [,1]      [,2]
>>> [1,]  -0.587375 0.3173949
>>> [2,] 100.000000 0.1801181
>>>            [,1]      [,2]
>>> [1,]  -0.587375 0.3173949
>>> [2,] 100.000000 0.1801181
>>>
>>> I have two questions here:
>>> 1. Why is the [2,1] modified, when I would have expected the [2,2] entry
>>> to
>>> be modified, given that I had assign 100.0 to xD[1,1] in C++?
>>
>> Well when I call cxxfunction on that code I get a warning.  Did you?
>>
>> The warning tells me that I am indexing xD as a one-dimensional array
>> and that leads me to believe that I probably want xD(1,1), not xD[1,1]
>>
>>> 2. Why does the change to the object D persist when we call the object
>>> again? This looks like D has been passed by reference and is therefore
>>> affected by what happened within the function. However, this is not the
>>> expected behaviour for an R function. What's going on here?
>>
>> It is the expected behavior when you pass an R object through the
>> .Call interface.  If you want to change a copy then define
>>
>> NumericMatrix xD(clone(D));
>>
>> which does the deep copy operation.
>>>
>>> Thank you very much for your help,
>>> Cedric
>>>
>>>
>>> --
>>> Cedric Ginestet
>>> Centre for Neuroimaging Sciences (L3.04)
>>> NIHR Biomedical Research Centre
>>> Department of Neuroimaging
>>> Institute of Psychiatry, Box P089
>>> King's College London
>>> De Crespigny Park
>>> London
>>> SE5 8AF
>>> Tel: (+44) 20-3228-3052
>>> Fax: (+44) 20-3228-2116
>>> Email: cedric.ginestet at kcl.ac.uk
>>>
>>> _______________________________________________
>>> 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
>>>
>>>
>


More information about the Rcpp-devel mailing list