[Rcpp-devel] type mismatch between NumericMatrix and IntegerMatrix
Dirk Eddelbuettel
edd at debian.org
Sun Aug 7 14:55:38 CEST 2016
On 7 August 2016 at 07:17, JJ Allaire wrote:
| In the latter case the integer matrix is "converted" to a numeric matrix via a
| copy which is why your modification doesn't work.
"What he said..."
This is a known issue which we presented many times in talks. Something from
the most recent one is below.
| That said, modifying an object in place violates R's language semantics and
| could lead to incorrect computations (i.e. users expect that objects are
| immutable and this is part of what ensures the integrity of computations) so
| this is strongly discouraged.
"What he said..."
But this is something we cannot enforce from the Rcpp
side, nor can we enforce it as you had hope for. C/C++ just don't work that way.
The promised example is here. Run the two examples to the output, and study
the difference:
-----------------------------------------------------------------------------
## NumericVector: A Second Example
A second example alters a numeric vector:
```cpp
#include <Rcpp.h>
// [[Rcpp::export]]
NumericVector f(NumericVector m) {
m(0) = 0;
return m;
}
```
## NumericVector: A Second Example
Calling the last example with an integer vector:
\small
```{r numVecEx3-a}
Rcpp::sourceCpp("code/numVecEx3.cpp")
x <- 1:3 # same as c(1L, 2L, 3L)
print(data.frame(x=x, fx=f(x)), row.names=FALSE)
```
## NumericVector: A Second Example
Calling the last example with a numeric vector:
```{r numVecEx3-b}
x <- c(1.0, 2.0, 3.0)
print(data.frame(x=x, fx=f(x)), row.names=FALSE)
```
We pass `x` as a `SEXP` which is a pointer.
Use `Rcpp::clone()` for deep copy.
-----------------------------------------------------------------------------
For what it is worth that is on slides 74 to 76 of
http://dirk.eddelbuettel.com/papers/jsm2016_rcpp_course.pdf
Hth, Dirk
--
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
More information about the Rcpp-devel
mailing list