Documentation sur les "bonnes pratiques en R"

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Gilles San Martin
Messages : 211
Enregistré le : 08 Juin 2007, 17:25

Documentation sur les "bonnes pratiques en R"

Messagepar Gilles San Martin » 29 Nov 2008, 03:54

Bonjour

Je suis récemment tombé sur une discussion de la mailing list de R où un des participants dénonçait la lenteur de R par rapport à d'autres langages orientés stats.
Il a reçu pour réponse ceci :

Can you give some evidence for this statement, please?

At the moment, I'd bet that you use forgot to pre-allocate a
result array in R and do something like the "notorious horrible" (:-)
1-dimensional

r <- NULL
for(i in 1:10000) {
r[i] <- verycomplicatedsimulation(i)
}

instead of the "correct"

r <- numeric(10000)
for(i in 1:10000) {
r[i] <- verycomplicatedsimulation(i)
}

If r is a matrix or even higher array, and you are using rbind()
or cbind() inside the loop to build up the result,
the problem will become even worse.


Personnellement, je pratiquais les trois méthodes (selon l'humeur) sans savoir que certaines étaient plus lentes que d'autres et "notorious horrible".

Dans le même genre, on m'a un jour conseillé d'utiliser colSums au lieu de apply avec FUN=sum.

Je me demande donc si il il existe quelque part un document synthétisant de manière claire les choses à éviter dans R, en d'autres terme un guide des bonnes pratiques de programmation en R.

J'ai bien noté les précieuses recommandations à la fin du document de Christophe Genolini : http://christophe.genolini.free.fr/webT ... /index.php
C'est juste dommage qu'on explique pas le pourquoi de certaines règles (mais bon ce n'est qu'une annexe et ce n'est donc pas le but premier du document). On a alors souvent l'impression d'appliquer stupidement certaines règles sans trop savoir pourquoi (par exemple pourquoi utiliser <- au lieu de = ou encore FALSE au lieu de F). De manière générale, çà concerne surtoût la lisibilité plus que par exemple la rapidité.

Peut-être ceci (??) :
S Poetry de P.J. Burns
http://www.burns-stat.com/pages/spoetry.html

Merci d'avance pour vos avis
Gilles

Christophe Genolini
Messages : 698
Enregistré le : 12 Juin 2006, 21:37
Contact :

Messagepar Christophe Genolini » 30 Nov 2008, 09:02

Clair que mes propositions ne sont que des propositions et qu'elles ne concerne QUE présentation / lisibilité et débugage, pas l'optimisation. Ca ne concerne pas l'optimisation parce que je n'y connais rien.

Ceci étant dit, la partie "bonne pratique" de ce tutorial a été fortement revue a la hausse. Je peux te l'envoyer. Et surtout si tu réussis a établir quelques regles, je veux bien les intégrer, en te citant naturellement.

Gilles San Martin
Messages : 211
Enregistré le : 08 Juin 2007, 17:25

Messagepar Gilles San Martin » 30 Nov 2008, 13:19

Bonjour Christophe

Je veux bien recevoir la dernière version de ton document.

Peut-être pourrais-tu citer les bouquins/documents d'où tu tires tes recommandations avec quelques commentaires sur l'utilité de chaque livre/document. J'imagine qu'il y a aussi beaucoup de recommandations trouvées au hasard des forums/rencontres (comme malheureusement souvent en R).

Merci d'avance
Gilles

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 30 Nov 2008, 22:27

Bonsoir,

Voici juste une petite remarque inutile pour jeter un peu d’huile sur le feu.
J’aime bien cette remarque de John Fox :

« This procedure is very inefficient computationally, taking more than four minutes on my Windows 2000 computer, which has an 800 MHz processor and plenty of memory. But the programming was very simple, requiring perhaps five minutes to write and debug: A time expenditure of about 10 minutes is insignificant in preparing data for analysis. » dans http://cran.r-project.org/doc/contrib/F ... ession.pdf.

Pour les bonnes pratiques en programmation orientée objet, il y a un nombre de document assez impressionnant (voir par exemple, les documents disponibles chez http://www.developpez.com/ , http://conception.developpez.com/livres/#livresObj , etc …).


bonne nuit :D

@++

pierre
=@===--------¬-------¬------¬-----¬
liens utiles :
http://www.gnurou.org/Writing/SmartQuestionsFr
http://neogrifter.free.fr/welcomeOnInternet.jpg
]<((((*< -------------------------------

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 01 Déc 2008, 08:28

Bonjour,


Juste un petit lien avec quelques règles d'optimisation :
http://www.insightful.com/Hesterberg/articles/EfficientSplus.txt

quelques astuces :
http://wiki.r-project.org/rwiki/doku.php?id=tips:tips

et un site avec quelques liens :
http://casoilresource.lawr.ucdavis.edu/drupal/node/100

Maxime

Christophe Genolini
Messages : 698
Enregistré le : 12 Juin 2006, 21:37
Contact :

Messagepar Christophe Genolini » 01 Déc 2008, 17:05

Petite surprise sur "l'optimisation" : vaut-il mieux utiliser des "if" ou des switch" ?

Code : Tout sélectionner

        a <- "a"

        depIf <- Sys.time()
            if(a=="a"){cat("A")}else{}
            if(a=="b"){cat("B")}else{}
            if(a=="c"){cat("B")}else{}
            if(a=="d"){cat("B")}else{}
            if(a=="e"){cat("B")}else{}
            if(a=="f"){cat("B")}else{}
        finIf <- Sys.time()

        depSw <- Sys.time()
            switch(a,
                   "a"={cat("A")},
                   "b"={cat("A")},
                   "c"={cat("A")},
                   "d"={cat("A")},
                   "e"={cat("A")},
                   "f"={cat("B")})
        finSw <- Sys.time()
        cat("If :",finIf-depIf," Switch :",finSw-depSw," Gain Switch/if =",(finSw-depSw)/as.numeric(finIf-depIf),"\n")
# If : 0.1400001  Switch : 0.1090000  Gain Switch/if = 0.7785706


Réponse : c'est quasi pareil. Personnellement, j'aurais vraiment parié sur une large victoire du switch...

C.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité