Une formation aux bonnes pratiques avec Git et R
Insee
Insee
R
et Git
Retour à la page d’accueil pour explorer les autres versions
Origine : communauté des développeurs logiciels
Constats :
Conséquence : un ensemble de règles informelles, conventionnellement acceptées comme produisant des logiciels fiables, évolutifs et maintenables
L’activité du statisticien / datascientist tend à se rapprocher de celle du développeur :
projets intenses en code
projets collaboratifs et de grande envergure
complexification des données et donc des infrastructures
déploiement d’applications pour valoriser les analyses
Source : Peng R., Reproducible Research in Computational Science, Science (2011)
Une reproductibilité parfaite est coûteuse
Git
est un standard atteignable et efficient
Note
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
1️⃣ Qualité du code et structure des projets
2️⃣ Les formats de données de diffusion
3️⃣ Le contrôle de version
4️⃣ Normes de sécurité
5️⃣ Ouverture
D’une vision utilitariste du code à une vision du code comme outil de communication
Favoriser la lisibilité et la maintenabilité
Faciliter la réutilisation
Assurer la transparence méthodologique
Adopter les standards communautaires
Utiliser des fonctions
Documenter son code
Indiquer les packages utilisés afin d’éviter les conflits
Deux outils pratiques aident à respecter les standards :
Note
Il existe un guide de référence pour bien coder en R
: le Tidyverse style guide.
README
Eviter impérativement les formats de données adhérents à un langage (RDS
, RData
, fst
, sas7bdat
, etc.).
Deux formats à privilégier :
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
Git
, 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 internesQue 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
Nous nous sommes concentrés sur les briques:
renv
)Il faut distinguer deux types de processus de production :
celui qui est entièrement automatisé, et où l’intervention humaine est limitée ;
celui qui nécessite du travail humain postérieur de la part du statisticien, et donc fait l’objet de tâtonnements
Git
répond-il bien aux enjeux de la production ?Exemple avec calcul du taux de pauvreté dans SRCV
Les tâtonnements supposent des allers et retours sur différentes hypothèses :
les variantes peuvent se décliner sous la notion de branches ;
en traçant l’ensemble des modifications du code, Git
facilite la complète reproductibilité des tâtonnements ;
au travers de l’historique, il permet de retracer l’ensemble du cheminement ;
le git blame
permet de voir qui a fait quoi ;
mais cela nécessite une discipline sur l’usage de Git
.
⇒ deux notions essentielles : reproductibilité et traçabilité
Changement de paradigme : le code self doit être maintenu
R
et des packages ;renv
et la notion de lockfile
anticiper les montées de version des logiciels :
renv
Exemple de renv.lock
renv.lock
{
"R": {
"Version": "4.3.3",
"Repositories": [
{
"Name": "CRAN",
"URL": "https://packagemanager.posit.co/cran/latest"
}
]
},
"Packages": {
"BH": {
"Package": "BH",
"Version": "1.84.0-0",
"Source": "Repository",
"Repository": "CRAN",
"Hash": "a8235afbcd6316e6e91433ea47661013"
},
"DBI": {
"Package": "DBI",
"Version": "1.2.2",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"methods"
],
"Hash": "164809cd72e1d5160b4cb3aa57f510fe"
},
"DT": {
"Package": "DT",
"Version": "0.33",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"crosstalk",
"htmltools",
"htmlwidgets",
"httpuv",
"jquerylib",
"jsonlite",
"magrittr",
"promises"
],
"Hash": "64ff3427f559ce3f2597a4fe13255cb6"
},
"KernSmooth": {
"Package": "KernSmooth",
"Version": "2.23-22",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"stats"
],
"Hash": "2fecebc3047322fa5930f74fae5de70f"
},
"MASS": {
"Package": "MASS",
"Version": "7.3-60.0.1",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"grDevices",
"graphics",
"methods",
"stats",
"utils"
],
"Hash": "b765b28387acc8ec9e9c1530713cb19c"
},
"Matrix": {
"Package": "Matrix",
"Version": "1.6-5",
"Source": "Repository",
"Repository": "CRAN",
"Requirements": [
"R",
"grDevices",
"graphics",
"grid",
"lattice",
"methods",
"stats",
"utils"
],
"Hash": "8c7115cd3a0e048bda2a7cd110549f7a"
},
"R6": {
"Package": "R6",
"Version": "2.5.1",
"Source": "Repository",
"Repository": "RSPM",
"Requirements": [
"R"
],
"Hash": "470851b6d5d0ac559e9d01bb352b4021"
},
"RColorBrewer": {
Question
Quels sont, selon vous, les principaux risques de sécurité liés au développement en self ?
Git
Notion de boîte de dialogue qui permet d’entrer le mot de passe sans l’inscrire dans le code
library(DBI)
library(RPostgresInsee)
library(rjson)
## import des éléments de connexion
connexion_details <- fromJSON(file = "X:/HAB-LOGFIDELI/Production en self/conf_servers_fideli.json")
## connexion au clone
connexion_clone <- do.call(dbConnect, args = c(connexion_details$clone[2:4],
list(drv = Postgres(),
password = rstudioapi::askForPassword("Mot de passe :"))))
KeePass
:
.kdbx
chiffré.kdbx
sont protégés par un mot de passe maîtreGit
(utiliser le fichier .gitignore
)On préférera toujours avoir des données stockées dans un unique espace pour lequel les droits d’accès sont gérés individuellement.
R
, Python
et leurs packages sont gratuits, comment est-ce possible ?R
: disaggR
, btb
, RJDemetra
…L’ensemble des bonnes pratiques qui ont été présentées sont issues de l’open source.
Bonnes pratiques pour les projets statistiques (retour au site principal ; )