Я сделал первый удар по функции 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
Что здесь происходит?