Передача Rcpp по ссылке и по значению

Я впервые попробовал функцию Rcpp через inline, и это решило мою проблему со скоростью (, спасибо, Дирк!): 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

. Что тут происходит?

15
задан Community 23 May 2017 в 11:54
поделиться