【问题标题】: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 和其他地方。

    【讨论】:

      猜你喜欢
      • 2020-02-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2014-10-29
      • 1970-01-01
      相关资源
      最近更新 更多