我通过inline
提出在RCPP功能的第一个尝试,它解决了我的速度问题(感谢德克!): R: Replacing negative values by zeroRCPP通过引用传递与按值
最初的版本是这样的:
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
这是怎么回事吗?
你能重新表达你的问题吗?你是否想要覆盖?在我看来,版本2实现了它所要做的事情......此外,还有一个致力于Rcpp的专用邮件列表,您可能会得到体面的答案。 –
为了清晰起见,试图编辑。我不希望它被覆盖。如果这不明显,那么我想我应该发布到邮件列表,但不想打扰别人。 –