gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:06:26 26 4
gpt4 key购买 nike

考虑一个虚拟的例子

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com