Chapitre 1 Nommer les objets
Un code écrit avec des noms de variables et de fonctions explicites est autant, voire plus, informatif que les commentaires qui l’accompagnent. C’est pourquoi il est essentiel de respecter des conventions pour le choix des noms des objets afin d’assurer la lisibilité des programmes. Sur ce point, il est important de rappeler que R
est un langage sensible à la casse, ce qui signifie que variable
et Variable
renvoient à deux objets différents.
Les fonctions de base R
utilisent des points dans les noms de fonctions ( contrib.url()
par exemple) ou les noms de classes (data.frame
). Il est néanmoins mieux de réserver les points uniquement aux objets de classe S3
sous la forme fonction.classe
1.1 Noms des fichiers
Extensions Il existe plusieurs types de fichiers en R
, chacun avec son extension:
- l’extension est
.R
pour les scripts; - l’extension est
.RData
pour les fichiers de données (attention à la casse dans ce cas); - Il est également possible d’enregistrer un objet
R
dans un format.rds
; - Les fichiers
Rmarkdown
sont enregistrés sous l’extension.Rmd
.
Versions
-
L’utilisation d’outils de contrôle de version tel que
git
est recommandée et est très bien intégrée dansRstudio
. L’intérêt degit
est de permettre un suivi des évolutions du fichier bloc par bloc et contributeur par contributeur. Dans ce cas, il n’est pas nécessaire de millésimer les fichiers, l’historique des modifications d’un fichier étant géré pargit
(cf. Section Contrôle de version). Pour le versioning, on pourra également utiliser le Gitlab interne de la Drees ou de l’Insee. -
En l’absence de système de contrôle de version (
git
ouSVN
), il est recommandé de millésimer les fichiers (scripts et données). Pour les données, on millésimera systématiquement avec la date (pour les agents de la Drees, la fonctionrdrees::exporter_data
propose de le faire automatiquement).
Organisation
-
Pour les scripts, il est préférable d’indiquer en préfixe le numéro du script dans la série de scripts à exécuter (si cela s’applique) et en suffixe le millésimage. On peut ajouter le suffixe “_dev” pour les scripts en développement, et le suffixe “_prod” pour les scripts utilisés en production (à ne pas modifier). Ainsi, si un script est nommé
1_import_donnees_vdev_20190417.R
,1
indique le numéro du script (c’est le premier à exécuter dans le projet),vdev
indique qu’il s’agit d’une version de développement et20190417
indique le millésime. - Pour millésimer automatiquement les fichiers de données en sortie d’un script, on peut utiliser le modèle de script suivant:
# parametres ---------------------------------------------
date <- Sys.Date()
chemin_donnees <- "I:/.../"
# code
#...
# enregistrement -----------------------------------------
save(fichier, file = paste0(chemin_donnees, "fichier_", date, ".RData"))
On pourra sauvegarder des objets intermédiaires au cours du script. Pour s’assurer de la reproductibilité des scripts, l’intégralité du code devra être réexécuté in fine.
Bonnes pratiques:
- Ne pas utiliser de symboles spéciaux dans le nom du fichier (
-.,;:\/$
^`, caractères accentués, etc.); - Privilégier les underscore (par exemple
donnees_menages
) au CamelCase (consiste à donner un nom en mettant une majuscule à chaque début de mot : par exempledonneesMenages
). Si vous préférez le CamelCase, utilisez-le systématiquement dans tout le script pour uniformiser le code.
1.2 Noms des variables
Nom de la variable Il est recommandé d’utiliser des substantifs pour nommer une variable. Privilégier les underscores (par exemple donnees_menages
) au CamelCase (par exemple donneesMenages
). Si vous préférez le CamelCase, utilisez-le systématiquement dans tout le script pour uniformiser le code.
Bonnes pratiques
-
Ne pas utiliser
T
ouF
pour nommer des variables (car en plus d’être rarement des noms explicites ce sont les abréviations des booléens TRUE et FALSE); -
Ne pas utiliser de noms qui sont déjà des fonctions de base
R
(mean
par exemple). Cela ne génère pas toujours d’erreur mais cela évite des erreurs difficilement détectables! Voici un exemple d’erreur difficile à détecter:
# On commence avec équivalence TRUE et T
TRUE == T
## [1] TRUE
2 == TRUE
## [1] FALSE
# On crée une variable T à un moment (shortcut de TRUE)
T <- 2
# On a rompu l'équivalence entre T et TRUE
TRUE == T
## [1] FALSE
2 == T
## [1] TRUE
1.3 Noms des fonctions
Nom de la fonction Il est recommandé d’utiliser des verbes pour nommer une fonction. Il est préférable de nommer une fonction en fonction de ce qu’elle fait. Privilégier les underscores
(par exemple calculer_taxes
) au CamelCase (par exemple calculerTaxes). Si vous préférez le camelCase, utilisez-le systématiquement dans tout le script pour uniformiser le code.
Nom des arguments Il est préférable de nommer les arguments explicitement dans un appel de fonction, sauf dans les cas où il ne peut y avoir d’équivoque. Exemple: calculer_taxes(revenu = 10000, taux = 0.2)
plutôt que calculer_taxes(10000, 0.2)
. Si on choisit de ne pas nommer les arguments dans un appel de fonction, il faut alors respecter l’ordre des arguments.
Voici un exemple avec la fonction base::gsub()
, dont les arguments sont pattern = ..., replacement = ..., x = ...
dans cet ordre. Supposons qu’on appelle cette fonction mais qu’on se trompe dans l’ordre des arguments. Alors on ne remplacera pas toto par cool comme voulu mais aura un comportement difficile à anticiper:
my_awesome_func <-
function(x = "super toto", replacement = "cool", pattern = "toto"){
gsub(x, replacement, pattern)
}
my_awesome_func()
## [1] "toto"
my_awesome_func2 <-
function(x = "super toto", replacement = "cool", pattern = "toto"){
gsub(x = x, replacement = replacement, pattern = pattern)
}
my_awesome_func2()
## [1] "super cool"
Bonnes pratiques Comme pour le choix du nom des variables, il est recommandé de ne pas utiliser T
ou F
pour nommer des fonctions (car ce sont les booléens TRUE
et FALSE
) ou des noms qui sont déjà des fonctions de base R
(mean
par exemple).