Traducir R a C ++ (eventualmente con Rcpp) [cerrado]

10

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.

usuario603
fuente
3
Estoy totalmente en desacuerdo con su título editado y su pregunta agregada / editada. Simplemente se equivoca si considera que Rcpp es un compilador de código o cuando nos pide que reescribamos el código por usted.
Dirk Eddelbuettel
@Dirk:> seguro, ¿cuál sería un título sugerido (el más antiguo?). Realmente no me importa esta función en particular. Estoy interesado en aprender formas de hacer que mis códigos se ejecuten más rápido. Si tienes otro ejemplo, publícalo. Felizmente cerraré este.
usuario603

Respuestas:

13

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? ;-)

Dirk Eddelbuettel
fuente
@Dirk:> a) hay mucha implementación de mediana () (diga 'pull' en el paquete pcaPP) por lo que es un juego justo. b) ¿quiere decir que uno no notará un aumento considerable en los tiempos de ejecución? c) está bien, pero creo que el problema con este código no es realmente la traducción a C ++, sino la idea de llamar a algunas funciones R [pnorm, dnorm, ...] en C ++ (por supuesto, puedo estar realmente equivocado) d) ¿Puedes proporcionar el enlace a tu lista de correo?
usuario603
¿Podemos dividir las subpreguntas una por una? A) puede llamar a la función R desde C ++, por conveniencia pero no necesariamente por velocidad. Ver los ejemplos / en Rcpp. B) No dije tal cosa. C) Eso es todo fácil desde Rcpp 0.8.7, vea los documentos 'Rcpp sugar', las publicaciones en Rcpp-devel y nuestras presentaciones recientes. D) Se cuelga de la página R-forge; solo google para 'rcpp-devel'.
Dirk Eddelbuettel
1
1) Comience en dirk.eddelbuettel.com/presentations.html y vaya bajando. 2) Hay seis subdirectorios para ejemplos / así que no estoy seguro de por qué te enfocas en uno. 3) Hay más de 770 pruebas unitarias que se duplican como ejemplos si desea mirar lo suficientemente de cerca. 4) Hay ocho (8) viñetas en el paquete Rcpp. 5) Somos autores de algunos otros paquetes que usan Rcpp, también puedes verlos. 6) Por último, CRAN enumera quince paquetes dependiendo de Rcpp; todos estos también son ejemplos.
Dirk Eddelbuettel
1
Amigo: Hay una lista de correo para el proyecto que le interesa. Toda nuestra documentación sugiere preguntar en la lista de correo. Entonces, ¿por qué, oh, por qué sigues acumulando aquí? Podemos complacer parada que ahora. Por último, su 'demasiado superficial' requeriría un poco de respaldo. Con gusto revisaré los parches, simplemente no los publique aquí . ¿De acuerdo?
Dirk Eddelbuettel
2
@kwak: Respondiendo a "Es algo que debería subcontratarse a la comunidad": Espero ver sus contribuciones a medida que trabaja usted mismo en estos ejemplos.
Joshua Ulrich