я сделал первый удар на функцию Rcpp через inline
и решить мою проблему скорости (спасибо Dirk!): R: Replacing negative values by zeroRcpp проход ссылочной VS. по значению
Первоначальная версия выглядела так:
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, где вы, вероятно, получите достойные ответы. –
Пробовал редактировать для ясности. Я не хочу, чтобы он переписывался. Если это неочевидно, я предполагаю, что я должен опубликовать его в списке рассылки, но не хотел бы беспокоить людей в противном случае. –