考虑一个虚拟的例子
> cppFunction('
+ NumericVector invert(NumericVector& x) {
+ x = x + 1;
+ return x;
+ }')
> invert(1:3)
[1] 2 3 4
Rcpp糖很方便,但是效率很低,因为它创建了一个新对象并分配了它,而不是就地修改原始对象。凭直觉,我尝试做一个
x += 1;
,但是Rcpp抱怨如何使用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>
所以对于你的问题:
答案是“按原样使用”,但要注意您的对象类型。如果这样做,则通过对R对象存储器的直接和无缝访问,可以提供最有效的访问。
[1]一个已知且有案可查的警告是发生无声 Actor 。上面的方法不适用于
1:5
,因为那些是整数,由于我们在函数签名中包含NumericVector
,因此它们首先会被复制到数字中。有关此内容的更多信息,请参见Rcpp FAQ, Question 5.1和其他地方。关于c++ - 用Rcpp糖就地修改SEXP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57805254/