首页 > 解决方案 > 使用 Rcpp 糖就地修改 SEXP

问题描述

考虑一个虚拟示例

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

Rcpp 糖很方便,但可能效率低下,因为它创建一个新对象并分配它,而不是就地修改原始对象。直觉上,我试图做一个x += 1;,但 Rcpp 抱怨

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

如何使用 Rcpp 糖执行就地修改?

标签: c++rrcppsyntactic-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> 

所以对于你的问题:

如何使用 Rcpp 糖执行就地修改?

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

[1] 一个已知并记录在案的警告是何时发生无声演员表。上面的内容不起作用,1:5因为这些整数首先被复制到 numeric,就像我们NumericVector在函数签名中一样。有关此问题的更多信息,请参阅Rcpp FAQ、问题 5.1和其他地方。


推荐阅读