用Rcpp糖就地修改SEXP

nal*_*zok 2 c++ r syntactic-sugar rcpp

考虑一个虚拟的例子

> cppFunction('
+ NumericVector invert(NumericVector& x) {
+     x = x + 1;
+     return x;
+ }')
> invert(1:3)
[1] 2 3 4
Run Code Online (Sandbox Code Playgroud)

Rcpp糖很方便,但是效率很低,因为它创建了一个新对象并分配了该对象,而不是就地修改原始对象。x += 1;凭直觉,我尝试执行,但Rcpp抱怨

错误:没有可行的重载'+ ='

如何使用Rcpp糖进行原位修饰?

Dir*_*tel 6

您的假设是错误的-没有进行复制[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> 
Run Code Online (Sandbox Code Playgroud)

所以对于你的问题:

如何使用Rcpp糖进行原位修饰?

答案是“按原样使用”,但要注意您的对象类型。如果这样做,则可以通过直接和无缝访问R对象存储器来提供最有效的访问

[1]一个已知且有案可查的警告是发生无声演员。上面的方法不起作用,1:5因为那些整数像我们NumericVector在函数签名中一样先复制到数字。有关此内容的更多信息,请参见Rcpp FAQ,问题5.1和其他地方。