Traduire R en C ++ (éventuellement avec Rcpp) [fermé]

10

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.

user603
la source
3
Je suis fortement en désaccord avec votre titre modifié et votre question ajoutée / modifiée. Vous vous trompez simplement si vous considérez Rcpp comme un compilateur de code, ou lorsque vous nous demandez de réécrire le code pour vous.
Dirk Eddelbuettel
@Dirk:> bien sûr, quel serait un titre suggéré (le plus ancien?). Je ne me soucie pas vraiment de cette fonction particulière, je suis intéressé à apprendre des façons de rendre mes codes plus rapides. Si vous avez un autre exemple, veuillez le poster. Je fermerai volontiers celui-ci.
user603

Réponses:

13

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

Dirk Eddelbuettel
la source
@Dirk:> a) il y a beaucoup d'implémentation de median () (dites 'pull' dans le paquet pcaPP) donc c'est un jeu équitable. b) vous voulez dire que vous ne remarquerez pas une augmentation considérable des temps de fonctionnement? c) d'accord, mais je pense que le problème avec ce code n'est pas vraiment la traduction en C ++, plutôt l'idée d'appeler certaines fonctions R [pnorm, dnorm, ...] en C ++ (bien sûr je peux vraiment me tromper) d) pouvez-vous fournir le lien vers votre liste de diffusion?
user603
Pouvons-nous s'il vous plaît diviser les sous-questions une par une? A) vous pouvez appeler la fonction R à partir de C ++ - pour plus de commodité mais pas nécessairement pour la vitesse. Voir les exemples / dans Rcpp. B) Je n'ai rien dit de tel. C) C'est un jeu d'enfant depuis Rcpp 0.8.7, voir les docs 'Rcpp sugar', les articles sur Rcpp-devel et nos récentes présentations. D) Il se bloque sur la page R-forge; google juste pour 'rcpp-devel'.
Dirk Eddelbuettel
1
1) Commencez par dirk.eddelbuettel.com/presentations.html et descendez. 2) Il existe six sous-répertoires d'exemples / je ne sais donc pas pourquoi vous vous concentrez sur un seul. 3) Il existe plus de 770 tests unitaires qui servent d'exemples si vous souhaitez regarder de plus près. 4) Il y a huit (8) vignettes dans le package Rcpp. 5) Nous avons créé quelques autres packages qui utilisent Rcpp, vous pouvez également les consulter. 6) Enfin, le CRAN répertorie quinze packages en fonction de Rcpp - ce sont tous des exemples également.
Dirk Eddelbuettel du
1
Mec: Il y a une liste de diffusion pour le projet qui vous intéresse. Toute notre documentation suggère de demander sur la liste de diffusion. Alors pourquoi-oh-pourquoi continuez-vous à vous entasser ici? Pouvons-nous s'il vous plaît arrêter cela maintenant. Enfin, votre «trop superficiel» nécessiterait une certaine sauvegarde. Je réviserai volontiers les correctifs, mais ne les postez pas ici . D'accord?
Dirk Eddelbuettel
2
@kwak: Répondre à "C'est quelque chose qui devrait être sous-traité à la communauté": J'ai hâte de voir vos contributions lorsque vous travaillerez vous-même sur ces exemples.
Joshua Ulrich