我通过第一次对Rcpp函数进行了测试inline,它解决了我的速度问题(感谢Dirk!): R:将负值替换为零
初始版本如下所示:
library(inline)
cpp_if_src <- '
Rcpp::NumericVector xa(a);
int n_xa = xa.size();
for(int i=0; i < n_xa; i++) {
if(xa[i]<0) xa[i] = 0;
}
return xa;
'
cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")
但是,当调用时cpp_if(p),它会覆盖p输出,这与预期不符。因此,我认为它是通过引用传递的。
所以我用以下版本修复了它:
library(inline)
cpp_if_src <- '
Rcpp::NumericVector xa(a);
int n_xa = xa.size();
Rcpp::NumericVector xr(a);
for(int i=0; i < n_xa; i++) {
if(xr[i]<0) xr[i] = 0;
}
return xr;
'
cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")
这似乎工作。但是现在当我将其重新加载到R中时,原始版本不再覆盖其输入(即,相同的精确代码现在也不会覆盖其输入):
> cpp_if_src <- '
+ Rcpp::NumericVector xa(a);
+ int n_xa = xa.size();
+ for(int i=0; i < n_xa; i++) {
+ if(xa[i]<0) xa[i] = 0;
+ }
+ return xa;
+ '
> cpp_if <- cxxfunction(signature(a="numeric"), cpp_if_src, plugin="Rcpp")
>
> p
[1] -5 -4 -3 -2 -1 0 1 2 3 4 5
> cpp_if(p)
[1] 0 0 0 0 0 0 1 2 3 4 5
> p
[1] -5 -4 -3 -2 -1 0 1 2 3 4 5
我不是唯一尝试复制此行为并发现不一致结果的人:
http://chat.stackoverflow.com/transcript/message/4357344#4357344
这里发生了什么?
暮色呼如
BIG阳