Une formation aux bonnes pratiques avec Git et R
R
et Git
Retour à la page d’accueil pour explorer les autres versions
L’activité du statisticien / datascientist tend à se rapprocher de celle du développeur :
Source : Peng R., Reproducible Research in Computational Science, Science (2011)
Git
est un standard atteignable et efficientNote
Quel socle de bonnes pratiques pour les projets statistiques en ?
Un point de départ commun
Un point de départ commun
Une structuration de projet plus viable
Git
1️⃣ Le contrôle de version : pourquoi faire ?
2️⃣ Le contrôle de version avec Git
pour en finir avec ça :
ou ça :
ou encore ça :
prior <- read_csv(prior_path)
prior <- prior %>%
select(id, proba_inter, proba_build, proba_rfl) %>%
separate(id, into = c('nidt', 'grid_id'), sep = ":") %>%
group_by(nidt) %>%
mutate(
proba_build = proba_build/sum(proba_build),
proba_rfl = proba_rfl/sum(proba_rfl),
) %>%
unite(col = "id", nidt, grid_id, sep = ":")
# Test
# prior_test <- prior %>%
# mutate(
# proba_inter = round(proba_inter, 4)
# proba_build = round(proba_build, 4)
# proba_rfl = round(proba_rfl, 4)
# )
write_csv(prior_round, "~/prior.csv")
Pour arriver à ça :
Source : ThinkR
Un modèle distribué
Source : specbee.com
Qui permet l’expérimentation en toute sécurité
Source : lutece.paris.fr
Quel que soit l’environnement de travail
Avec des outils pour faciliter la collaboration
Une vitrine pour les projets et l’organisation
Git
L’utilisation de Git
nécessite certaines notions préalables:
filesystem
Linux
Mais
RStudio
, Sublime Merge
, VS Code
) qui facilitent l’apprentissageGit
, GitHub
, GitLab
… quelles différences ?Git
est un logiciel ;RStudio
, VS Code
…)Git
, GitHub
, GitLab
… quelles différences ?GitHub
et GitLab
sont des forges logiciellesAstuce
GitHub
: utilisation pour les projets open-sourceGitLab
: utilisation pour les projets internesremote
)origin
Source : Git Documentation
Action | Commande |
---|---|
Cloner un projet | git clone [url-to-git-repo] |
Afficher les changements | git status |
Retrouver l’URL du dépôt distant | git remote -v |
Action | Commande |
---|---|
Ajouter des changements à l’index de Git (stage fixes) |
Un seul fichier : git add <file-name> Tous les fichiers déjà indexés : git add -u Tous les fichiers ⚠️ : git add -A |
Warning
La méthode git add -A
peut amener à suivre les modifications de fichiers qui ne devraient pas l’être (par exemple, des données).
Il est recommandé de bien réfléchir avant de l’utiliser (ou d’avoir un bon .gitignore
)
Action | Commande |
---|---|
Faire un commit |
git commit -m "message" |
Pousser les changements locaux vers le dépôt distant (branche master ) |
git push origin master |
Récupérer les changements sur le dépôt distant (branche master ) |
git pull origin master |
git clone https://github.com/username/projet.git
git clone git@github.com:username/projet.git
git clone https://gitlab.insee.fr/username_or_groupname/projet.git
git clone git@gitlab.insee.fr:username_or_groupname/projet.git
Préparation de l’environnement de travail
GitHub
GitHub
RStudio
. Dans l’onglet de configuration Git
du service, fixer la durée du Cache
pour le stockage des identifiants GitHub
à une valeur suffisamment élevéeRStudio
du Datalab
):
File
→ New project
→ Version Control
→ Git
GitHub
SSP Cloud
(ou un gestionnaire de mot de passe) :
Mon Compte
-> Git
-> Token d'accès personnel pour Forge Git
GitHub
et le tokenPréparation de l’environnement de travail
gitlab.insee.fr
RStudio
. Dans l’onglet de configuration Git
du service, fixer la durée du Cache
pour le stockage des identifiants Gitlab
à une valeur suffisamment élevéeRStudio
de la plateforme LS3
):
File
→ New project
→ Version Control
→ Git
gitlab.insee.fr
LS3
(ou un gestionnaire de mot de passe) :
Mon Compte
-> Git
-> Token d'accès personnel pour Forge Git
gitlab.insee.fr
(code insee en 6 caractères) et le token❓ Question : qu’est ce qui différencie le projet cloné d’un projet quelconque ?
Premiers commits
scripts
script1.R
et script2.R
, chacun contenant quelques commandes R
de votre choixRStudio
commit
, auquel on donnera un message descriptif pertinentscript1.R
et modifier le contenu du fichier script2.R
RStudio
RStudio
❓ Question : à ce stade, le dépôt du projet sur GitHub
/ Gitlab
(remote
) a-t-il été modifié ?
Interactions avec le dépôt distant
push
pour intégrer les changements locaux au projet distantGitHub
/ Gitlab
Que versionne-t-on ?
.html
, .pdf
, modèles…)Note
Pour définir des règles qui évitent de committer tel ou tel fichier, on utilise un fichier nommé .gitignore
.
Si on mélange du code et des éléments annexes (output, données…) dans un même dossier, il faut consacrer du temps à ce fichier.
Des modèles de .gitignore
existent sur internet, par exemple celui-ci pour les projets .
N’hésitez pas à y ajouter des règles conservatrices (par exemple *.csv
), comme cela est expliqué dans la documentation utilitR
.
Format des commits
Le fichier .gitignore
Lors de la création du projet sur GitHub
/ Gitlab
, nous avons demandé la création d’un fichier .gitignore
, qui se situe à la racine du projet. Il spécifie l’ensemble des fichiers qui seront toujours exclus de l’indexation faite par Git
.
*.pdf
et *.html
data
à la racine du projet et créer à l’intérieur de celui-ci un fichier data/raw.csv
avec une ligne de données quelconque.gitignore
le dossier data/
❓ Question : que se passe-t-il lorsque l’on ajoute au .gitignore
des fichiers qui ont déjà été commit sur le projet Git ?
R
utilitR
propose plusieurs chapitres sur Git
Git
Git
sur AUS
Git
!R
Améliorations graduelles dans l’échelle de la reproductibilité :
1️⃣ Qualité du code
2️⃣ Structure des projets
3️⃣ Formats de données
Préparation de l’environnement de travail
RStudio
. Dans l’onglet de configuration Git
du service, fixer la durée du Cache
pour le stockage des identifiants GitHub
à une valeur suffisamment élevéeRStudio
du Datalab
):
File
→ New project
→ Version Control
→ Git
get_data.R
en copiant le contenu de ce fichier, puis l’exécuterscript.R
dans votre dépôt en copiant le contenu de ce fichier.gitignore
. Que signifie-t-elle ?“Good coding style is like correct punctuation: you can manage without it, butitsuremakesthingseasiertoread”
R
: le Tidyverse style guide.Deux outils pratiques aident à respecter les standards :
Astuce
Dans le cas de :
Règle d’or
Il faut utiliser une fonction dès qu’on utilise une même portion de code plus de deux fois (don’t repeat yourself (DRY))
Règles pour écrire des fonctions pertinentes
Comment bien documenter un script ?
roxygen2
.Bien documenter… mais pas trop !
. . .
Bof :
# Utilise string si x est non manquant et non vide
if (!is.na(x) && nzchar(x)) {
use_string(x)
}
. . .
Mieux !
x_is_not_empty_string <- (!is.na(x) && nzchar(x))
if (x_is_not_empty_string) {
use_string(x)
}
. . . Voir la présentation de Maëlle Salmon sur le « Code beau ».
R
utilise par défaut la librairie chargée le plus récemmentpackage::fonction()
dplyr::filter()
Exemple
package1
et package2
contiennent chacun une fonction appelée superFonction
.package2
est chargé après package1
, alors superFonction
désigne par défaut la fonction de package2
.package1::superFonction
et package2::superFonction
R
R
Python
en 3A d’ENSAEPartie 1 : vérification du bon fonctionnement du code
Un code reproductible est avant toute chose un code fonctionnel ! Repérez les erreurs qui empêchent le script script.R
de s’exécuter correctement, et les corriger.
Partie 2 : premiers standards de qualité
R
lintr
et styler
.tidyverse
: lintr::use_lintr(type = "tidyverse")
script.R
: lintr::lint("script.R")
.
script.R
: styler::style_file("script.R")
.styler
est un formatter peu intrusif.Partie 3 : une meilleure gestion des packages utilisés
package::fonction
pour les packages rarement utilisés dans le script.tidyverse
au complet est rarement utile. N’importer à la place que les packages effectivement utilisés dans le script.Partie 4 : (auto-)documentation du code
library
pour les mettre tous ensemble au début du script.# TITRE NIVEAU 1 ------------
et ## TITRE NIVEAU 2 ==========
Partie 5 : une meilleure gestion des secrets
secrets.yaml
où vous écrivez ce secret sous la forme key: value
. ⚠️ Attention : le package yaml
impose la création d’une ligne vierge à la fin du fichier pour être valide.script.R
, importer ce YAML (avec yaml::read_yaml("secrets.yaml")
) pour créer une variable api_token
ayant cette valeur..gitignore
le fichier secrets.yaml
et indiquer dans le README.md
de votre projet que les secrets sont stockés dans ce fichier. ⚠️ Attention : il ne faut pas committer secrets.yaml
car le jeton d’API est personnel et secret!2 Construire des projets reproductibles
├── report.Rmd
├── correlation.png
├── data.csv
├── data2.csv
├── fig1.png
├── figure 2 (copy).png
├── report.pdf
├── partial data.csv
├── script.R
└── script_final.R
Source : eliocamp.github.io
Git
, on s’assure de toujours travailler dans un projet RStudio !├── data
│ ├── raw
│ │ ├── data.csv
│ │ └── data2.csv
│ └── derived
│ └── partial data.csv
├── R
| ├── script.R
│ ├── script_final.R
│ └── report.Rmd
└── output
├── fig1.png
├── figure 2 (copy).png
├── figure10.png
├── correlation.png
└── report.pdf
├── data
│ ├── raw
│ │ ├── dpe_logement_202103.csv
│ │ └── dpe_logement_202003.csv
│ └── derived
│ └── dpe_logement_merged_preprocessed.csv
├── R
| ├── preprocessing.R
│ ├── generate_plots.R
│ └── report.Rmd
└── output
├── histogram_energy_diagnostic.png
├── barplot_consumption_pcs.png
├── correlation_matrix.png
└── report.pdf
README.md
, situé à la racine du projet, est à la fois la carte d’identité et la vitrine du projetREADME.md
complets :
devtools
et usethis
Partie 1 : modularisation du projet
R/functions.R
.fonction_de_stat_agregee
un nom plus pertinent et des noms d’arguments plus transparents.script.R
, appeler en début de chaîne ces fonctions avec source("R/functions.R", encoding = "UTF-8")
.roxygen2
.script.R
.script.R
.Partie 2 : création d’un package
usethis::create_package()
R
du package un module stat.R
et y copier la fonction de statistique agrégéedevtools::load_all()
et vérifier que la fonction marche correctementDESCRIPTION
. En particulier, spécifier les dépendances nécessaires (Imports
) et facultatives (Suggests
)devtools::document()
. Où est-elle stockée et sous quel format ??ma_fonction
GitHub
est y mettre le code du package. Vérifier que le package peut être installé en local avec la fonction devtools::install_github()
.RDS
, RData
, fst
, sas7bdat
, etc.).Manipulation des formats CSV et Parquet
individu_reg.csv
get_data.R
pour écrire les données au format Parquet
à l’aide de la fonction arrow::write_parquet
script.R
pour importer le fichier Parquet
à l’aide de la fonction arrow::read_parquet
utilitR
R
ENSAE
Slack
grrr, très dynamiqueTchap
Langage RR
à l’Insee : le salon Tchap
Insee - Outils Stats v2Bonnes pratiques pour les projets statistiques (retour au site principal ; )