使用 Rcpp 糖就地修改 SEXP

Modify SEXP in-place with Rcpp sugar

考虑一个虚拟示例

> 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 sugar进行就地修改?

您的假设是错误的 -- 没有制作任何副本 [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?

答案是 'just use it as is' 但请注意您的对象类型。如果这样做,那么 最有效的访问可能 是通过对 R 对象内存的直接无缝访问提供的。

[1] 一个已知且记录在案的警告是当发生静默转换时。以上不适用于 1:5,因为它们是 整数 ,它们首先被复制到数字,因为我们在函数签名中有 NumericVector。有关此内容的更多信息,请参阅 Rcpp FAQ, Question 5.1 和其他地方。