Une formation aux bonnes pratiques avec Git et R
Insee
Insee
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 (notion de citizen developers) :
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
eedd
Un point de départ commun
Un point de départ commun
Une structuration de projet plus viable
Des standards communautaires qui favorisent la reproductibilité et la maintenabilité
De multiples outils pour simplifier leur mise en oeuvre
Un coût d’autant plus faible que l’on se place en amont
Le mouvement de modernisation du self est l’occasion d’une montée en compétence collective
Canaux de discussion
Tchap
: Langage R (Tchap)Slack
: r-grrrDocumentation
Formation : Espace formation du SSP Cloud
Réseau data science : SSPHub
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 (vérifications ex post non automatisables, etc.) de la part du statisticien, et donc fait l’objet de tâtonnements :
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, 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 .
⇒ deux notions essentielles : reproductibilité et traçabilité
Changement de paradigme : le code self doit être maintenu
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": {
D’une vision utilitariste du code à une vision du code comme outil de communication
Favoriser la lisibilité et la maintenabilité
Assurer la transparence méthodologique
La modularité pour éviter les monolithes
Deux outils pratiques aident à respecter les standards :
Note
Il existe un guide de référence pour bien coder en : le Tidyverse style guide.
README
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
Git
, GitHub
, GitLab
… quelles différences ?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…)Format des commits
Nous nous sommes concentrés sur la brique:
renv
)Eviter impérativement les formats de données adhérents à un langage (RDS
, RData
, fst
, sas7bdat
, etc.).
Deux formats à privilégier :
Question
Quels sont, selon vous, les principaux risques de sécurité liés au développement en self ?
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ître.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.
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 ; )
Comment faire de la gestion de projets avec
Gitlab
?Gitlab
!