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

Darren Cook darren at dcook.org
Fri Nov 4 08:56:17 CET 2011


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

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

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)


More information about the Rcpp-devel mailing list