[Rcpp-devel] can one modify array in R memory from C++ without copying it?

Dirk Eddelbuettel edd at debian.org
Fri Nov 4 14:36:29 CET 2011

On 4 November 2011 at 16:56, Darren Cook wrote:
| > Not a bug, this is expected behaviour.
| Hello Romain,
| I did not mean the behaviour is a bug; I mean it is going to cause bugs.
| I was wondering if there is a way to stop the implicit data coercion,
| forcing the programmer to request it explicitly.

R does exactly that too

R> a <- 1
R> typeof(a)
[1] "double"
R> a <- 1L
R> typeof(a)
[1] "integer"
and Rcpp uses Proxy Classes so this is the Right Thing (TM) to do.  We think,
at least.

| E.g. Are the implicit type conversions happening with some extra copy
| constructors? If so, we could have conditional compilation to exclude
| those. Something like:
|   #ifndef FORCE_EXPLICIT
|   IntegerMatrix(double*){...}
|   #endif
| Then programmers who don't like surprises would define FORCE_EXPLICIT,
| and then their code would sometimes not compile and they would have to
| write an explicit conversion.
| (I've not thought that through, I just wanted to demonstrate what I had
| in mind.)

If you feel really strongly about you could consider a patch that makes this
non-R behaviour you suggest an option.  To most of us who use Rcpp between R
and C++ it really is a feature.

Don't get me wrong though: I like your input here and maybe the implicit
nature of things needs to be stressed even more.


| Darren
| > 
| > If you pass a matrix of ints to the NumericVector ctor, Rcpp has no
| > choice but to coerce the data to a matrix of double, which means new
| > data, hence the original data does not get modified.
| > 
| > If you pass a matrix of double, no copy is required, therefore Rcpp
| > operates directly on the data.
| > 
| > Those are features.
| > 
| > 
| > 
| > Le 4 nov. 2011 à 08:01, Darren Cook <darren at dcook.org> a écrit :
| > 
| >>> I.e. the point of his code was to show that a matrix of doubles
| >>> gets modified, a matrix of ints does not.
| >> 
| >> Or change the first line from NumericMatrix to: Rcpp::IntegerMatrix
| >> r_m(mem);
| >> 
| >> Then the behaviour is reversed. The matrix of doubles does not get 
| >> modified, but the matrix of ints does!
| >> 
| >> Dirk, Romain, this is a bug-in-waiting. Is there any way to
| >> generate a warning when the implicit deep copy happens? Or
| >> alternatively when the pointer is being used implicitly... but my
| >> hunch is that I want to know when there is any implicit conversion
| >> between int and double: modern C++ style is to explicitly declare
| >> all type conversions with static_cast<> and friends.
| -- 
| Darren Cook, Software Researcher/Developer
| http://dcook.org/work/ (About me and my work)
| http://dcook.org/blogs.html (My blogs and articles)
| _______________________________________________
| 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
"Outside of a dog, a book is a man's best friend. Inside of a dog, it is too
dark to read." -- Groucho Marx

More information about the Rcpp-devel mailing list