10 votos

Traducir R a C++ (eventualmente con Rcpp)

Me gustaría aprender a usar Rcpp. Fui a través de los documentos en el paquete del CRAN sitio web, pero estoy trabajando en un ejemplo práctico (segunda práctica, teniendo en cuenta convolve3) sería más útil .

Propongo el siguiente código, desde el robustbase paquete, ya que no es ni demasiado largo ni demasiado corto, utiliza una combinación de R tipos y funciones R y tiene uno de esos pequeños aritmética de iteraciones que son demasiado lentos en R. ¿Cómo usted va sobre la Rcpp-ing ?

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 tanto como usted puede.

EDITAR Es realmente la idea de una explicación paso a paso de cómo se podría ir sobre la conversión de un bien escrito (y documentado) código R (así, al menos, las bases están bien) a una implementación eficiente. La elección del código se puede argumentar un poco al azar, pero creo que refleja el arco típico de la secuencia de comandos en nuestro planos (llamadas funciones R que uno no desea traducir, utiliza aritmética de bucles....).

EDIT2 de los comentarios me doy cuenta de que esto puede ser en realidad un gran trabajo que hacer en C++ (no me di cuenta que al publicar el código). En vista de esto, el uso de piezas individuales como el pedagógico de los dispositivos está bien. Que finalmente va a analizar las piezas a unir mediante la edición de la pregunta.

14voto

Jay Puntos 395

Interesante pregunta, pero muy posiblemente demasiado difícil para ser discutido brevemente:

  • Usted necesita un C++lado implementaciones de median()

  • El citado código de paquete robustbase es muy 'R-optimizado", que puede no ser el mejor punto de partida.

  • Rcpp no es una " R "compilador" que lanzan cualquier función en a 'hacer que sea más rápido". Es más acerca de la conexión existente en el código de C++, o escribir nuevo código de C++.

  • Por supuesto, lo anterior puede ser traducido (Turing-equivalencia y todo eso), pero que puede no ser la mejor manera de aprender sobre el uso de Rcpp. Creo que tenemos más simples ejemplos en la lista de correo.

Por último, no es esta una programación pregunta ASÍ? ;-)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X