Hi Yixuan,

You're right!


Whether the input matrix can be modified by a function that takes NumericMatrix 
is determined by whether the input matrix is a NumericMatrix or an 
IntegerMatrix (the latter needs to be copied and converted). The `mode()` 
function was pretty useless for determining a matrix object's type, but as at 
least `is.integer()` is predictive.


When I wrote another function that takes an IntegerMatrix, it was able to 
modify an input IntegerMatrix in-place.


Thank you,

David


________________________________
From: Yixuan Qiu <yixuan....@cos.name>
Sent: November 26, 2014 2:13 AM
To: David Shih
Cc: rcpp-devel@lists.r-forge.r-project.org
Subject: Re: [Rcpp-devel] Rcpp: Modification of input argument: Undefined 
behaviour


Hello David,
The general answer to your question is, if the type of your matrix (integer or 
numeric) in R is different from the one you declare in Rcpp, Rcpp will make a 
copy and cast it to the appropriate type.
For example, 1:12 is of type integer, and if you pass it as a NumericMatrix, 
Rcpp will implicitly copy the whole matrix, so no matter what modification you 
did, the original matrix will not change.

Best,
Yixuan

On Nov 26, 2014 1:33 AM, "David Shih" 
<david.s...@mail.utoronto.ca<mailto:david.s...@mail.utoronto.ca>> wrote:
Hello,

There was an earlier post on this subject, but based on my experimentation, the 
behaviour of modifying input argument is different depending on how the matrix 
was initialization and other factors...

I wrote a Rcpp function to modify an input matrix. After calling this function, 
the input matrix is modified under some circumstances and not modified under 
others. The behaviour is the same on repeat runs and on both Linux 
(3.16.3-1-ARCH) and Mac (OSX 10.9).

The R script, C++ code, and the results are available on Bitbucket:

https://bitbucket.org/dshih/rcpp_inplace

I don't quite understand when the input matrix is modified in place by the Rcpp 
function and when the input matrix is be copied on write in the Rcpp function.

When I stay within Rcpp/C++, a input argument can be modified in-place by a 
function. (This feature was critical to my optimization.)

After the code returns to R, I would expect either copy-on-write or in-place 
modification but not both.

What is the correct behaviour?


Thank you,

David J. H. Shih

The Hospital for Sick Children
Peter Gilgan Centre for Research and Learning
686 Bay St
17th floor, Room 17.9707
Toronto, ON  M5G 0A4
Canada
Tel:  (416) 813-7654 x309157<tel:%28416%29%20813-7654%20x309157>
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org<mailto:Rcpp-devel@lists.r-forge.r-project.org>
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to