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?
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
<[email protected]> 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: [email protected]
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel