Me gustaría aprender a usar Rcpp . Revisé los documentos en el sitio web de CRAN del paquete, pero creo que sería más útil trabajar en un ejemplo práctico (segunda práctica, considerando convolve3).
Propongo el siguiente código, del paquete robusto de base porque no es ni demasiado largo ni demasiado corto, usa una combinación de tipos R y funciones R y tiene una de esas pequeñas iteraciones aritméticas que son demasiado lentas en R. ¿Cómo harías con Rcpp? -lo?
scaleTau2<-function (x, c1 = 4.5, c2 = 3, consistency = TRUE, mu.too = FALSE){
n <- length(x)
medx <- median(x)
x. <- abs(x - medx)
sigma0 <- median(x.)
mu <- if (c1 > 0) {
x. <- x./(sigma0 * c1)
w <- 1 - x. * x.
w <- ((abs(w) + w)/2)^2
sum(x * w)/sum(w)
}
else medx
x <- (x - mu)/sigma0
rho <- x^2
rho[rho > c2^2] <- c2^2
if (!identical(consistency, FALSE)) {
Erho <- function(b) 2*((1-b^2)*pnorm(b)-b*dnorm(b)+b^2)-1
Es2 <- function(c2) Erho(c2*qnorm(3/4))
nEs2 <-ifelse(consistency == "finiteSample",n-2,n)*Es2(c2)
}
else nEs2 <- n
c(if (mu.too) mu, sigma0 * sqrt(sum(rho)/nEs2))
}
Por favor explique todo lo que pueda.
EDITAR Realmente es la idea de una explicación paso a paso de cómo convertiría un código R bien escrito (y documentado) (por lo que al menos las bases están bien) en una implementación eficiente. La elección del código es discutible un poco al azar, pero creo que refleja la secuencia de comandos típica del arco en nuestros planos (llama a las funciones R que uno no quiere traducir, usa bucles aritméticos ...).
EDIT2 de los comentarios me doy cuenta de que esto puede ser un gran trabajo en C ++ (no me di cuenta al publicar el código). Con respecto a esto, está bien usar piezas individuales como dispositivos pedagógicos. Eventualmente analizaré las piezas juntas editando la pregunta.
Respuestas:
Pregunta interesante, pero posiblemente demasiado difícil de discutir brevemente:
Necesitaría implementaciones en el lado C ++ de
median()
El código citado del paquete robustbase está altamente 'optimizado en R', lo que puede no ser el mejor punto de partida.
Rcpp no es un 'compilador de R' al que le arrojas cualquier función para 'hacerlo más rápido'. Se trata más de conectar el código C ++ existente o escribir un nuevo código C ++.
Por supuesto, lo anterior se puede traducir (equivalencia de Turing y todo eso), pero esa puede no ser la mejor manera de aprender a usar Rcpp . Creo que tenemos ejemplos más simples en la lista de correo.
Por último, ¿no es esta una pregunta de programación para SO? ;-)
fuente