You are on page 1of 19

R, Bonnes pratiques

Christophe Genolini

1 .

Table des mati`res e 1 Des bonnes pratiques. pour quoi faire ? 2 Choix de l’´diteur de texte e 3 Architecture du code 4 Variables 5 Commentaires et documentation 6 Divers 7 Astuces de programmation R´f´rences ee 4 4 6 10 12 13 16 18 2 .

3 .

. ils ont cherch´ un coupable. a Avant d’entrer dans le vif du sujet. un petit avertissement : toutes ces r`gles et les sie tuations qui les justifient donnent l’illusion d’ˆtre balayables d’un haussement d’´paules : e e “Ca. ces r`gles ne sont que e u e des petites astuces pour ´tourdis : bien les utiliser fera toute la diff´rence entre le bon e e programmeur et le programmo-touriste. les u e e informaticiens. ils ont ´cras´ une petite larme et ont cherch´ les causes de l’´chec. Ils e e ont fabriqu´ des nouveaux langages et d´fini des r`gles de programmation. soit issues des discussions de la liste de diffusion de R [3] et du forum GuR [1]. Et ils ont trouv´. Des gens tr`s forts et tr`s e e o e e e intelligents ont donc cherch´ des moyens de rendre la programmation moins buggu´e.. A gauche. e Les r`gles que nous proposons ici sont soit adapt´es des bonnes pratiques qu’on trouve e e dans les livres sur les langages objets. on arrive tout de mˆme ` faire les e e e a erreurs qu’elles essaient de pr´venir.” La pratique ¸ ¸ e nous affirme l’inverse : Mˆme en suivant les r`gles. c’est e e un fait av´r´ intrins`que aux ordinateurs : tous les programmes sont buggu´s !” Sauf que ee e e dans le cas pr´sent. il est non colori´. pour quoi faire ? Quand les hommes ont commenc´ ` envoyer des fus´es dans l’espace 3 et qu’elles ont ea e explos´ en plein vol. d´tection des parenth`ses et indentation automatique). e ´ Voil` un exemple de code tir´ du pacakge kml.. ca ne m’arrivera pas. On appelle e e e ¸a la programmation propre ou les bonnes pratiques.. ou encore librement inspir´es du document de Martin e M¨chler [2].. e e Installer un ´diteur intelligent (comme emacs ou Tinn-R) ne vous prendra pas beaue coup de temps. e e e e e Comme il fallait bien brˆler quelqu’un. O` est a e e u l’erreur ? 4 . mais cela vous fera gagner des heures de recherche de parenth`ses ou de e guillemets “mal plac´s”. la facture du bug ´tait plutˆt sal´e. en faisant un peu attention. D’o`. ont d´clar´ les informaticiens tous marris.E1 Utilisez un ´diteur de texte intelligent e (avec coloriage... “C’est pas d’not’ faute.. c Les bonnes pratiques sont des r`gles que le programmeur choisit de suivre pour am´e e liorer la qualit´ de sa programmation et diminuer le nombre de bugs de ses programmes. ne vous y trompez pas. pas besoin de r`gle. 2 Choix de l’´diteur de texte e .1 Des bonnes pratiques.

On voit que dans le bas du texte. dans un langage informatique. chaque parenth`se e e e e ouvrante doit ˆtre coupl´e ` une parenth`se fermante . l’accolage manquante a ´t´ ajout´e .. Plus pr´cis´ment. ee e 5 . mˆme chose pour les accolades et e e a e e les crochets. le mˆme code est colori´.. e e Ainsi. On en e e conclut qu’il y a un guillement mal ferm´. sur le code de gauche. l’accolade du bas ferme bien l’accolade d’ouverture de la fonction. des instructions e e comme cat sont dans la couleur r´serv´e normalement au texte entre guillemets. Sur le code de droite.´ A droite. C’est celui du trois`me cat. et a e e r´ciproquement (mˆme chose pour les accolades ou les crochets). l’accolade du bas que le programmeur pensait ˆtre e l’accolade finale fermant la fonction s’av`re fermer l’accolade du if. On peut en conclure e qu’il manque l’accolade fermante du if. un ´diteur ´volu´ peut d´tecter automatiquement les couples de parene e e e e th`ses et accolades. Un ´diteur ´volu´ a g´n´ralement la gentillesse de surligner la parenth`se e e e e e e ouvrante correspondant ` la parenth`se fermante sur laquel est positionn´ le curseur. e e De mˆme.

13 triangleRect <.0. e Il est donc courant de les “regrouper” : des instructions rudimentaires sont assembl´es e en bloc.3 Architecture du code Un programme est g´n´ralement un code long et compliqu´ fait ` partir d’instructions e e e a rudimentaires. il suffit de se demander ce que fait le code suivant : long <. e e e Pour s’en convaincre. result <.0 f o r ( i in 1: long ){ 6 . les blocs sont regroup´s en fonctions. Il est important que e cette architecture soit visible.} Une instruction par ligne rendrait les choses bien plus lisibles : long <.i )) result <.result + i } return ( result )} C’est plus lisible.A1 Deux instructions distinctes doivent ˆtre sur deux lignes s´par´es. e e e e d’autres r`gles : e . . plusieurs r`gles : e . f o r ( i in 1: long ){ cat ( " \ n " . Pour cela. mais l’architecture g´n´rale reste cach´e. Ce d´coupage constitue “l’architecture d’un programme”.13 triangleRect <.A2 Les lignes doivent ˆtre indent´es de mani`re ` mettre e e e a les blocs constituant le code en valeur.function ( long ){ result <. return ( result ).i )).result + i }.function ( long ){ result <. rep ( " * " . Pour la mettre en ´vidence.function ( long ){ result <. a e Ces deux rˆgles permettent la mise en ´vidence des blocs.13. Une suite de 10 000 instructions rudimentaires serait incompr´hensible. rep ( " * " .0 f o r ( i in 1: long ){ cat ( " \ n " .A3 Chaque accolade fermante doit ˆtre verticalement align´e e e ` l’instruction d´finissant l’accolade ouvrante correspondante. triangleRect <. les fonctions sont elles mˆme utilis´es e e e pour d’autres fonctions et au final. le programme principal sera compos´ de quelques e fonctions. Notre code devient e e long <.

i )) result <. les accolades sont facultatives. on peut marquer un peu plus l’existence de blocs ou de fonctions en sautant des lignes : . rep ( " * " . La boucle for plus l’initialisation de result sont eux-mˆmes dans une fonction nomm´e triangleRect.result + i } return ( result ) } Il devient plus facile de comprendre ce que fait la fonction triangleRect : elle dessine un rectangle avec des ´toiles et calcule sa surface : e > triangleRect (4) * * * * * * * * * * [1] 10 Pour certaines instructions.13 triangleRect <. Par exemple. Ce bloc est contenu dans une boule for.cat ( " \ n " .result + i } return ( result ) } La structure commence ` apparaitre : Au plus bas niveau (le plus d´cal´ ` droite).i ) I= 1 I= 2 I= 3 I= 4 I= 5 Le r´sultat est le mˆme que celui produit en utilisant le code avec accolades : e e f o r ( i in 1:5){ cat ( " I = " .0 f o r ( i in 1: long ){ cat ( " \ n " .function ( long ){ result <.A4 Les blocs d’instruction ou les fonctions doivent ˆtre s´par´s par des lignes. e e e long <. a e ea on distingue un bloc. rep ( " * " . e e Enfin.i )) result <.i ) } I= 1 I= 2 I= 3 I= 4 I= 5 7 . quand un bloc d’instruction suit un for : f o r ( i in 1:5) cat ( " I = " .

Mais e e dans le premier cas. Omettre les accolades facultatives augmente le risque d’erreur de programmation. Mais omettre un else peut e introduire des ambiguit´s. De mˆme. on obtient : f o r ( i in 1:5) cat ( " I = " . le else d’une instruction if est facultatif.i ^2) } I = 1 I ^2= 1 I = 2 I ^2= 4 I = 3 I ^2= 9 I = 4 I ^2= 16 I = 5 I ^2= 25 Dans le deuxi`me cas. consid´rons le code e e i f ( cond1 ) i f ( cond2 ) cat ( " A " ) e l s e cat ( " E " ) Que veut le programmeur ? Veut-il : i f ( cond1 ) i f ( cond2 ) cat ( " A " ) else cat ( " E " ) Ou veut-il plutˆt : o i f ( cond1 ){ i f ( cond2 ) cat ( " A " ) else cat ( " E " ) 8 . u e Mais les bonnes pratiques ont justement pour but de traiter les erreurs d’inattention. la ligne ajout´e est “hors boucle”.Mais supposons que l’on souhaite ajouter une instruction dans la boucle. on a effectivement ajout´ une instruction dans la boucle.i ) cat ( " I ^2= " .i ^2) I = 1 I = 2 I = 3 I = 4 I = 5 I ^2= 25 Dans le deuxi`me : e f o r ( i in 1:5){ cat ( " I = " .i ) cat ( " I ^2= " . comme il n’y a pas d’accolade.A5 N’omettez pas les accolades facultatives. D’o` u la r`gle de “prudence architecturale” : e . on se serait rendu compte qu’il fallait ajouter les accolades. e Bien sˆr. Dans le premier cas. En effet. en ´tant attentif.

Bref. on appelle ca une “ambiguit´ syntaxie e ¸ e que” : il manque quelque chose. vous ˆtes re¸u. Bien sˆr. Qu’est-ce qui e est faux dans le code suivant ? f o r ( x in 1:100){ i f ( note [ x ] <10){ i f ( note [ x ] <8){ cat ( " Fail " ) } e l s e { cat ( " You get it " )}} Voil` le mˆme code apr`s application des r`gles pr´c´dentes : a e e e e e 9 . apr`s un examen. Si vous avez entre 8 et e e e c 10. il vaut mieux ´crire sans faire e e e de pari sur les r´actions de l’interpr´teur du langage. e En France. Dans le deuxi`me.Dans le premier cas. on peut essayer et voir comment R r´agit. vous pouvez pr´senter un oral de rattrapage deux semaines plus tard. vous avez ´chou´.A6 Toutes les conditions doivent comporter un else. u e Mais la version de R peut changer . si vous utilisez un autre logiciel de programmation. D’o` la rˆgle de d´sambiguiation : e u e e . peut-ˆtre que ce dernier se comportera diff´rament. En th´orie des langages. le else se rapporte au premier if. les possibilit´s sont les suivantes : si vous avez moins e e de 8. Selon ce que l’on souhaite : e e i f ( cond1 ){ i f ( cond2 ){ cat ( " A " ) } else { cat ( " E " ) } } else { } ou i f ( cond1 ){ i f ( cond2 ){ cat ( " A " ) } else { } } else { cat ( " E " ) } Il n’y a plus d’ambiguit´. mˆme s’il est vide. le else e se rapporte au deuxi`me. Si vous avez plus de 10.

c (9 .17) nn <.18 .c (17 .14) a <.705882 2. Le code correct est donc : f o r ( x in 1:100){ i f ( note [ x ] <10){ i f ( note [ x ] <8){ cat ( " Fail " ) } e l s e {} } else { cat ( " You get it " ) } } 4 Variables Les variables constituent g´n´ralement le cœur d’un programme.f o r ( x in 1:100){ i f ( note [ x ] <10){ i f ( note [ x ] <8){ cat ( " Fail " ) } else { cat ( " You get it " ) } } Les erreurs sont bien plus facilement identifiables : – Il manque une accolade – Il n’y a qu’un seul else pour deux if. que fait le code suivant ? Y a-t-il des bugs ? Que repr´sente e m? > > > > n <.555556 2. Mais dans le premier e e cas. dans le deuxi`me.18 .555556 2.18 .555556 2. non seulement on sait de e 10 . le r´sultat final est le mˆme.c (17 .705882 2.18 .c (9 .18 .4 ( m <.705882 Mˆmes questions avec le code suivant : e > > > > noteEleves <.sum ( n ) / a ) [1] 2.4 ( moyenneNotes <.5 .705882 Comme vous pouvez le constater.555556 2.18 . on ne sait pas ce que sont m.5 . Le else{cat("You get it !")} est utilis´ e a ` la mauvaise place.14) ageEleves <. Bien les nommer est e e fondamental. n et a . Par exemple.sum ( noteEleves ) / ageEleves ) [1] 2.17) nombreEleves <.

V3 Utilisez des noms commen¸ant par une majuscule pour les classes c par une minuscule pour les variables et les fonctions Bien sˆr. D’o` un raffinee e u ment de la r`gle V1 : e . Dans ce tutorial. Ce conseil peut paraˆ ıtre ´trange dans un livre d´di´ a la programmation objet. des variantes sont possibles. Pour plus de lisibilit´. Les instructions ae du langage seraient alors noy´es. En particulier.. 11 .V1 Nommez vos variables explicitement Une mani`re de faire est de choisir pour nom une suite de mots d´crivant la variable e e mais sans les s´parer par des espaces. moyenneNotes est utilis´e pour calculer la e moyenne des notes des ´l`ves).c (9 .4 ( m o y e n n e D e s N o t e s D u G r o u p e D e T r a v a u x D i r i g e s 6 <sum ( n o t e s D e s E l e v e s D u G r o u p e D e T r a v a u x D i r i g e s 6 ) / nombreDElevesDuGroupeDeTravauxDiriges6 ) notesDesElevesDuGroupeDeTravauxDiriges6 est clairement trop long.V2 Cherchez un compromis : les noms de variables doivent ˆtre de taille raisonnable. nombreDeFils. chaque mot commence par e e une majuscule sauf le premier.14) n o m b r e D E l e v e s D u G r o u p e D e T r a v a u x D i r i g e s 6 <. e tout en restant explicites. En effet.18 . Il serait ´galement surprenant qu’une moyenne de notes tourne e autour de 2.. La majorit´ des langages sont sensibles ` la case (ils font la distinction les majuscules e a des minuscules). Par exemple.. mais il est clair que le r´sultat devrait ˆtre un nombre ee e e unique et non un vecteur.6.. La premi`re r´gle est celle que notre exemple vient de mettre en ´vidence : e e e . les ee fonctions et les classes. si vous n’utilisez pas la programu mation objet 1 . D’o` l’importance de bien choisir le nom e a ee u des variables.. noteEleves ou ageEleves sont des noms explicites dont la lecture explique le contenu.quoi il retourne (selon toute vraisemblance.5 . cela rendrait le code illisible : e > > > + + + n o t e s D e s E l e v e s D u G r o u p e D e T r a v a u x D i r i g e s 6 <.. 1. L’erreur est facilement identifiable : la somme des notes des ´l`ves a ´t´ ee ee divis´e par les ˆges au lieu du nombre d’´l`ves. Le cˆt´ “explicite” n’est cependant pas le seul ` consid´rer. mais ndedgdtd6 (uniquement les initiales de la variable pr´c´dente) n’est pas explicite. Mais nous nous e e e ` sommes laiss´ dire que ce manuel ´tait aussi utilis´ par des lecteurs int´ress´s uniquement par la construce e e e e tion de package classique et par les bonnes pratiques. vous pouvez commencer vos variables par une minuscule et distinguer vos fonctions par une majuscule. nous avons utilis´ le principe suivant : e . Il est possible d’utiliser cette propri´t´ pour distinguer les variables. des noms de oe a e variables trop longs nous obligeraient ` ´crire un code sur plusieur lignes.

On peut a e c ainsi suivre son ´volution calculs plus facilement.C1 Commentez votre code. Par exemple. Il est d´conseill´ de les utiliser pour stocker des valeurs (mˆme si cela ne vous serait e e e pas venu ` l’esprit en vertu des r`gles V1 et V2 ?) a e De mˆme. des lettres comme c et t sont des fonctions e e R. il serait maladroit de d´finir la fonction e salaire : salaire <. dans > # ## Affecte 2 ` i a > i <.. il est peu souhaitable d’utiliser le mˆme nom pour une fonction et pour e e un des arguments de la fonction. . le nombre d’enfants est une variable enti`re (integer). il ne faut pas trop “coller” au programme. ee Concernant les noms de variables et fonctions. cela pr´sente e e un int´rˆt certain. il est pr´f´rable que chacun ait un ee usage unique : .V4 Un mˆme nom ne doit jamais avoir deux usages e Nous l’avions d´j` ´voqu´ lors de la nomenclature du constructeur d’une classe mais eae e le principe est g´n´ralisable.function ( salaire ){ cat ( " Salaire horaire = " .. Ces trois variables seraient donc nomm´es iNome breFils. nTaille et mCorEchelle.Variante : la notation Hongoise Il est ´galement possible de nommer les variables en commen¸ant par une lettre qui e c donne leur type : par exemple. e la taille est un num´rique (numeric) et la corr´lation des valeurs propres d’une ´chelle e e e de mesure est une matrice (matrix). a . salaire / 35) } 5 Commentaires et documentation Un programme est quelque chose de compliqu´. 12 . Par exemple. tout en restant explicite.2 le commentaire ne sert strictement ` rien. Pour un langage non typ´ comme R. L’art du commentaire n’est pas ais´ : e e en particulier. Les commentaires servent ` ´crire en fran¸ais ce que le programme fait. En particulier.C2 Commentez votre code intelligemment. Les commentaires permettent d’en e faciliter la lecture.

. e En particulier. puis on la modifie ensuite au a e fˆr et ` mesure qu’on re¸oit de l’information : u a c > > > > > > > > > > # ## Liste de nom data <. frame ( nom = c ( " Ren´ e " . method ){ .. Une initialisation malencontreuse peut fausser le r´sultat. o e e Dans le code suivant. return ( matrixImputed ) } Mˆme sans lire le code. " mean " . Il est donc capital de bien pr´ciser les variables ` fournir en entr´e a e a e et ce qu’il r´cup`rera ` la sortie." Raymonde " .51 # ## Calcul de la moyenne mean ( data $ age ) [1] 37. e un utilisateur (vous-mˆme six mois plus tard) doit pouvoir utiliser votre fonction sans e avoir ` lire le code. e L’une d’entre elles les impute. 6 Divers L’initialisation par d´faut n’a plus vraiment de raison d’ˆtre.matrixToImpute is a matrix with or without missing values # ## .method is a character string in " LOCF " . e e . on initie la variable age ` z´ro. les valeurs manquantes jouent en rˆle important (h´las !). on sait ce que cette fonction prend comme argument et e retourne comme valeur.56 data $ age [4] <.0 # ## Renseignement des lignes " au fur et ` mesure " a data $ age [1] <.5 13 ." Isidore " )) e # ## Initialisation avec la valeur 0 data $ age <. e e Exemple. " multiple " # ## # ## ImputeTraj returning a matrix without missing values # ## imputeTraj <.data .. dans un langage statistique comme R. e e a .Les commentaires peuvent intervenir au niveau local.C3 Documentez les entr´es et sorties de chaque fonction / m´thode.43 data $ age [3] <.function ( matrixToImpute ." Marcel " .D1 N’utilisez pas de valeurs par d´faut : e Une variable non initialis´e doit provoquer une erreur. Voil` ce qu’on peut lire dans le code : a # ## imputeTraj needs two arguments # ## . le package kml d´finit plusieurs fonctions qui travaillent sur des trajectoires. mais ´galement global. En effet.

Bien ´videmment. Une variable globale est une variable qui est d´finie ` l’ext´rieur d’une fonction.1. l’utilisation de la fonction d´pend d’autre chose que d’elle-mˆme. La non-initialisation de la variable age (ou plus exactement son initialisation e a ` NA) aurait permis d’´viter l’erreur : e > > > > > > > > > > # ## Liste de nom data <. ne pas avoir besoin de l’environnement global.51 # ## Calcul de la moyenne mean ( data $ age ) [1] NA ." Marcel " . frame ( nom = c ( " Ren´ e " .D3 N’utilisez jamais de variable globale. poids ){ return ( poids / taille ^2) } # ## Mes param` tres e monPoids <. taille = maTaille ) [1] 26. D`s e a e e lors.43 data $ age [3] <." Isidore " )) e # ## Initialisation avec la valeur NA data $ age <. Une e e fois termin´. maTaille ) [1] 0.86 maTaille <.80 # ## Mon IMC sans specifier le nom des arguments IMC ( monPoids .function ( taille . Une fonction doit e 14 . e e Or." Raymonde " . c’est s’exposer ` intervertir involontairement l’ordre des e a arguments : > > + + > > > > > # ## D´ finition de la fonction IMC e IMC <.54321 . le programmeur ne doit plus avoir besoin de lire son code.data .0002433748 > # ## Mon IMC en specifiant le nom des arguments > IMC ( poids = monPoids . Jamais.56 data $ age [4] <. le calcul de la moyenne est faux puisque l’ˆge de Marcel n’a pas ´t´ e a ee renseign´.D2 Dans l’appel d’une fonction. le principe pr´ludant ` la construction d’une fonction est le mˆme que celui d’une e a e m´thode : elle doit ˆtre automome. sp´cifiez les arguments par leur nom. e Ne pas respecter cette r`gle.NA # ## Renseignement des lignes data $ age [1] <.

42857 Rentabilit´ des ´ tudes = 312.2500 sesAnneesDEtude <.3300 # ## Variation sur salaire # ## la variable mesAnneesDEtude est globale salaireDetail <.5 sonSalaire <.3300 # ## Variation sur salaire # ## la variable mesAnneesDEtude est globale salaireDetail <.28571 Rentabilit´ des ´ tudes = 660 e e 15 . salaire / 35) cat ( " \ nRentabilit´ des ´ tudes = " . le calcul de Rentabilite pour lui est e faux. si vous copiere coller votre fonction dans un autre programme. la fonction d´finie n’est utilisable que pour moi et non pour e lui : > > > > > > > > + + + > > # ## Variables mesAnneesDEtude <.2500 sesAnneesDEtude <.function ( salaire ){ cat ( " Salaire horaire = " . salaire / anneesDEtude ) e e } # ## Pour moi salaireDetail ( salaire = monSalaire .5 e e > # ## Pour lui > salaireDetail ( salaire = sonSalaire ) Salaire horaire = 94.28571 Rentabilit´ des ´ tudes = 412.pouvoir fonctionner mˆme si son environnement change.8 monSalaire <. anneesDEtude = sesAnneesDEtude ) Salaire horaire = 94. anneesDEtude = mesAnneesDEtude ) Salaire horaire = 71. anneesDEtude ){ cat ( " Salaire horaire = " .. > > > > > > > > + + + > > # ## Variables mesAnneesDEtude <.function ( salaire ..8 monSalaire <.42857 Rentabilit´ des ´ tudes = 312. salaire / 35) cat ( " \ nRentabilit´ des ´ tudes = " . elle doit fonctionner sans am´nagement. Et pourtant. En particulier.5 sonSalaire <.5 e e > # ## Pour lui > salaireDetail ( salaire = sonSalaire . salaire / mesAnneesDEtude ) e e } # ## Pour moi salaireDetail ( salaire = monSalaire ) Salaire horaire = 71.5 e e Aucune erreur n’est signal´e. e Dans l’exemple suivant.

tout r`glement qui se respecte devrait comporter une clause pr´cisant de ne e e pas trop respecter le r`glement (sinon. Ce ne sont pas ` pr´cis´ment parler a a e e des bonnes pratiques." ClusterizLongData " ." ClusterizLongData " . function (x . Les abr´viations diminuent e la lisibilit´ du code. e e Si dans un cas particulier.j . } ) 7 Astuces de programmation Enfin. i f ( i == " var " ){ x@var <. value ){ i f ( i == " id " ){ x@id <. En respectant les r`gles : e setReplaceMethod( " [ " . gare au fanatisme. value ){ i f ( i == " id " ){ x@id <..value } else { } } ) Le code plus lisible quand on applique la r`gle D5 : e setReplaceMethod( " [ " . e Enfin.j .value } e l s e {}.value } else { } i f ( i == " name " ){ x@name <.value } e l s e {}. ignorez-la ! e a e Par exemple. elles rentrent plus dans la cat´gorie des m´thodes de programmae e tion li´es aux sp´cificit´s de R. utilisez FALSE / TRUE et non 0 / 1 ou F / T. function (x . e Par exemple.value } e l s e {}..D5 La clart´e doit primer sur le respect des r`gles.i .) e .. voil` quelques astuces de programmation.value } else { } i f ( i == " var " ){ x@var <.D4 N’utilisez pas d’abr´viation. plusieurs instructions if successives peuvent ˆtre plus lisibles si on les e note sur une ligne unique. i f ( i == " name " ){ x@name <. une r`gle nuit ` la lisibilit´. e e e 16 .i .

Il est pr´f´rable de les remplacer par les ee fonctions lapply et sapply. clasA . n’´crivez pas un long code pour e e e ne le tester qu’` la fin. il sera temps de penser ` e a l’optimisation. une fois e e la m´thode d´clar´e. diriez-vous ? C’est simplement pour ne pas laisser “trainer” dans l’espace de travail des variables. remplacez-le par is. e e Aussi. ´ 8.]..drop=FALSE].. 5. cela rendrait le d´buggage tr`s difficile. clasA .function (){ cat ( " Bonjour le monde " ) return ( invisible ()) } # ## Ici . Plus tard. fonctions ou objets qui ne seront plus utilis´es. e e e e e e A quoi bon la supprimer. Concernant les tests r´guliers. Testez votre code. au lieu de : > setMethod( + f = " methodA " . N’essayez pas d’´crire un code optimal.recherche des bugs # ## . bien plus tard. 7. N’utilisez pas = pour vos affectations. il est plus simple de d´clarer la fonction utilis´e par une m´thode ` part. Testez votre code r´guli`rement. N’utilisez pas x==NA. remplacez-le par <-. e C’est un peu comme passer l’´ponge sur la table apr`s le petit d´jeuner pour enlever les e e e miettes. N’attachez pas vos data. la fonction peut ˆtre supprim´e sans que cela n’affecte la m´thode. Les boucles ne sont pas efficaces dans R. a e e ´ 2. e e e Donc.tests pr´ liminaires e # ## . remplacez-le par x[ind.. # ## Ensuite . e quand votre code sera op´rationnel. + d e f i n i t i o n = function (){ + cat ( " Bonjour le monde " ) + return ( invisible ()) + } + ) on peut ´crire : e > > + + + > > > > > > > # ## D´ finition de la fonction e . N’utilisez pas 1:length(x). De mani`re g´n´rale. 4. Ecrivez un code clair et simple. remplacez-le par seq(along=x). methodA : # ## . methodA <. 6. a 3. plus c’est propre...detection des variables globales avec findGlobals # ## . + signature = " clasA " . Enfin. on teste . moins il y a de bugs. 9. infraction D3). Ecrivez de nombreuses petites fonctions et testez-les au fur et ` mesure. il est plus facile de tester une fonction qu’une m´thode.frame ` l’environnement (cela les tranformerait en vaa riables globales.na(x). On v´rifie e e e a e ensuite qu’elle fonctionne correctement puis on l’int`gre dans la m´thode. N’utilisez pas x[ind.1. d´ finition de la m´ thode e e 17 .

tuwien. methodA ) # ## Puis n´ toyage e rm (.ac. methodA ) R´f´rences ee [1] CIRAD. GuR : Groupe des Utilisateurs de R. Good Programming Practice.fr/logiciel-R.cirad. d e f i n i t i o n =.org.ci.> + + + + > > setMethod( f = " methodA " . [3] R-Core Team. M¨chler. 2004 http://forums. signature = " clasA " . clasA . 2004 a http://www. mailto:r-help@r-project. [2] M. Liste de diffusion. clasA . 18 .at/Conferences/useR-2004/Keynotes/Maechler.pdf.