me hizo un primer intento de una función de RCPP través inline
y se resolvió mi problema de velocidad (gracias a Dirk!): R: Replacing negative values by zeropase por RCPP vs. referencia por el valor
La versión inicial era la siguiente:
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")
Pero cuando se llama cpp_if(p)
, sobrescribió p
con la salida, que no era la prevista. Así que supuse que pasaba por referencia.
Así lo arreglé con la versión siguiente:
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")
que parecía funcionar. Sin embargo, ahora la versión original no sobrescribe su entrada más cuando me re-cargarlo en R (es decir, el mismo código ya no sobrescribe su entrada):
> 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
que no soy el único que ha tratado de reproducir este comportamiento y se han encontrado resultados contradictorios:
http://chat.stackoverflow.com/transcript/message/4357344#4357344
¿Qué está pasando aquí?
¿Puedes reformular tu pregunta? ¿Usted, o no, quiere sobrescribir? Me parece que la versión 2 logra lo que se propuso hacer ... Además, hay una lista de correo dedicada dedicada a Rcpp donde es probable que obtenga respuestas decentes. –
Trató de editar para mayor claridad. No quiero que sobrescriba. Si esto no es obvio, entonces supongo que debería publicar en la lista de correo, pero no quería molestar a la gente de lo contrario. –