使用 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 和其他地方。
考虑一个虚拟示例
> 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 和其他地方。