[Rcpp-devel] Rcpp: Modification of input argument: Undefined behaviour

Dirk Eddelbuettel edd at debian.org
Wed Nov 26 13:18:32 CET 2014


On 26 November 2014 at 02:13, Yixuan Qiu wrote:
| 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.

Precisely.  

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

This is discussed in a few places, often a standard topic in our (older)
slide decks and came up here a few times.

Rcpp generally uses a very light wrapper around a direct pointer to the
actual R object, so changes affect it.  However, in two cases you are
shielded: when an implicit copy is made (often from integer to numeric as
Yixuan said) or when an explicit copy is requested via clone().

Dirk
 
| Best,
| Yixuan
| 
| On Nov 26, 2014 1:33 AM, "David Shih" <david.shih at 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
|     _______________________________________________
|     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
| 
| _______________________________________________
| 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

-- 
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org


More information about the Rcpp-devel mailing list