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" R> 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. Dirk | 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 <dar...@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@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 _______________________________________________ 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