Je voudrais apprendre à utiliser Rcpp . J'ai parcouru les documents sur le site Web CRAN du package, mais je pense que travailler sur un exemple pratique (deuxième pratique, compte tenu de convolve3) serait plus utile.
Je propose le code suivant, du package robustbase car il n'est ni trop long ni trop court, utilise une combinaison de types R et de fonctions R et possède l'une de ces petites itérations arithmétiques qui sont trop lentes dans R. Comment feriez-vous pour Rcpp -le?
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))
}
Veuillez expliquer autant que possible.
EDIT C'est vraiment l'idée d'une explication étape par étape de la façon dont vous allez convertir un code R bien écrit (et documenté) (donc au moins les fondations sont correctes) en une implémentation efficace. Le choix du code est discutable un peu au hasard mais je pense qu'il reflète le script arch-typique sur nos plans (appelle les fonctions R que l'on ne veut pas traduire, utilise des boucles arithmétiques ....).
EDIT2 à partir des commentaires, je me rends compte que cela peut être un gros travail à faire en C ++ (je ne l'ai pas réalisé lors de la publication du code). À cet égard, l'utilisation de pièces individuelles comme dispositifs pédagogiques est acceptable. Je vais finalement analyser les morceaux ensemble en modifiant la question.
Réponses:
Question intéressante, mais probablement trop difficile à aborder brièvement:
Vous auriez besoin d'une implémentation côté C ++ de
median()
Le code cité du package robustbase est hautement «optimisé pour R», ce qui n'est peut-être pas le meilleur point de départ.
Rcpp n'est pas un «compilateur R» dans lequel vous lancez une telle fonction pour «la rendre plus rapide». Il s'agit davantage de connecter du code C ++ existant ou d'écrire du nouveau code C ++.
Bien sûr, ce qui précède peut être traduit (équivalence de Turing et tout ça) mais ce n'est peut-être pas la meilleure façon d'apprendre à utiliser Rcpp . Je pense que nous avons des exemples plus simples sur la liste de diffusion.
Enfin, n'est-ce pas une question de programmation pour SO? ;-)
la source