考虑一个虚拟的例子
> cppFunction('
+ NumericVector invert(NumericVector& x) {
+ x = x + 1;
+ return x;
+ }')
> invert(1:3)
[1] 2 3 4
Rcpp 糖很方便,但可能效率不高,因为它会创建一个新对象并对其进行分配,而不是就地修改原始对象。直觉上,我尝试执行 x += 1;
,但 Rcpp 提示
error: no viable overloaded '+='
如何使用 Rcpp 糖进行原位修改?
最佳答案
您的假设是错误的——没有制作任何拷贝 [1]。所以就地做吧:
R> library(Rcpp)
R> cppFunction("void inplaceMod(NumericVector x) { x = x + 1; }")
R> x <- as.numeric(1:5)
R> inplaceMod(x)
R> x
[1] 2 3 4 5 6
R>
所以对于你的问题:
How can I use Rcpp sugar to perform in-place modification?
答案是“按原样使用它”,但要注意您的对象类型。如果这样做,那么最有效的访问可能是通过对 R 对象内存的直接和无缝访问来提供的。
[1] 一个已知且记录在案的警告是当发生静默转换时。以上不适用于 1:5
,因为它们是 整数,因为我们在函数签名中有 NumericVector
,所以它们首先被复制到数字。查看Rcpp FAQ, Question 5.1和其他地方的更多信息。
关于c++ - 使用 Rcpp 糖就地修改 SEXP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57805254/