【问题标题】:Modify SEXP in-place with Rcpp sugar使用 Rcpp 糖就地修改 SEXP
【发布时间】:2020-01-08 08:13:23
【问题描述】:
考虑一个虚拟示例
> cppFunction('
+ NumericVector invert(NumericVector& x) {
+ x = x + 1;
+ return x;
+ }')
> invert(1:3)
[1] 2 3 4
Rcpp 糖很方便,但可能效率低下,因为它创建一个新对象并分配它,而不是就地修改原始对象。直觉上,我试图做一个x += 1;,但 Rcpp 抱怨
错误:没有可行的重载 '+='
如何使用 Rcpp 糖执行就地修改?
【问题讨论】:
标签:
c++
r
rcpp
syntactic-sugar
【解决方案1】:
你的假设是错误的——没有复制[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,因为它们是整数,它们首先被复制到数字,因为我们在函数签名中有NumericVector。有关此内容的更多信息,请参阅Rcpp FAQ, Question 5.1 和其他地方。