考虑一个虚拟的例子

> 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/

10-11 22:53
查看更多