c++ - 使用 Rcpp 糖就地修改 SEXP

标签 c++ r rcpp syntactic-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 糖进行原位修改?

最佳答案

您的假设是错误的——没有制作任何拷贝 [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?

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

[1] 一个已知且记录在案的警告是当发生静默转换时。以上不适用于 1:5,因为它们是 整数,因为我们在函数签名中有 NumericVector,所以它们首先被复制到数字。查看Rcpp FAQ, Question 5.1和其他地方的更多信息。

关于c++ - 使用 Rcpp 糖就地修改 SEXP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57805254/

相关文章:

r - 多年来连续一周的过渡

r - Rcpp 的基本文档

r - 动态增加 Rcpp 中列表的大小

c++ - Pthreads 和结构 C++

c++ - C++ : chars won't loop back to 'a' or 'A' 中的凯撒密码编码

r - 带有 R Part II 的重量数据

r - Highchart 修正瀑布图

c++ - 获取R数据帧的内存地址

c++ - std::enable_shared_from_this ... 新的 shared_ptr 是否知道获取 shared_from_this()?

c++ - 转换运算符问题