cassionAnalyse de données

Retour à la leçonLeçon 1 sur 8Un projet qui se rouvre

Une analyse qui se rouvre un an plus tard

Le même diaporama que les téléchargements, rendu sous forme de page. Lancez le diaporama pour le présenter en plein écran — les flèches ou un clic avancent d'une diapositive, Échap quitte.

Diapositives · PDFDiapositives · PowerPoint

  1. Diapositive 1 / 26

    Ce que couvre cette leçon

    • L'échec que cette leçon prévient
    • Les trois habitudes à abandonner
    • Le projet
    • here() plutôt qu'un chemin relatif
    • renv : les versions de paquets, consignées
    • Charger les paquets
    • Vérifier l'environnement avant de lui faire confiance
    • Ce qu'il faut remettre à un collègue
    • Ce qui vient ensuite
    Notes du présentateur
    Projets RStudio, here(), renv, et les deux habitudes — setwd() et un espace de travail sauvegardé — qui font qu'une analyse R ne tourne que sur une machine, un seul jour.
  2. Diapositive 2 / 26

    L'échec que cette leçon prévient

    • On vous demande d'expliquer le chiffre du trimestre dernier.
    Notes du présentateur
    On vous demande d'expliquer le chiffre du trimestre dernier. Vous ouvrez l'analyse, l'exécutez, et obtenez un chiffre différent — ou rien du tout, parce que le paquet qui l'avait produit a avancé de deux versions. Ce n'est pas un défaut de l'analyse. C'est l'environnement, et en R trois habitudes précises en sont la cause.
  3. Diapositive 3 / 26

    Les trois habitudes à abandonner

    • setwd()
  4. Diapositive 4 / 26

    Les trois habitudes à abandonner — En R

    setwd("/Users/marie/Bureau/nutrition")
  5. Diapositive 5 / 26

    Les trois habitudes à abandonner

    • rm(list = ls()) en tête de script
    • Redémarrez R à la place — Ctrl/Cmd + Maj + F10 sous RStudio
    • Un espace de travail sauvegardé
    Notes du présentateur
    Cela s'exécute sur exactement un ordinateur. C'est la raison la plus fréquente pour laquelle le script d'un collègue échoue sur votre machine, et le correctif n'est pas de modifier le chemin — c'est de ne plus en avoir. Cela ressemble à un départ propre et n'en est pas un. Cette instruction supprime les objets de votre espace de travail et laisse tout le reste : paquets attachés, options, répertoire de travail, tout ce qu'un .Rprofile a chargé. Un script qui en a besoin est un script non reproductible, et l'exécuter dans une session neuve est le seul véritable test. Redémarrez R à la place — Ctrl/Cmd + Maj + F10 sous RStudio. C'est le départ propre que rm(list = ls()) prétend être. RStudio propose d'enregistrer .RData à la fermeture et de le recharger au démarrage. Désactivez les deux :
  6. Diapositive 6 / 26

    Les trois habitudes à abandonner — Exemple

    Tools -> Global Options -> General
      Restore .RData into workspace at startup    [ ]
      Save workspace to .RData on exit            Never
    Notes du présentateur
    Un espace de travail rechargé signifie que votre session contient des objets dont vous ne voyez pas le code. L'analyse paraît fonctionner parce que quelque chose de la semaine dernière est encore en mémoire, et elle cesse de fonctionner dès qu'une autre personne l'exécute.
  7. Diapositive 7 / 26

    Le projet — Exemple

    muac-analysis/
      muac-analysis.Rproj
      data/
        raw/            l'export tel qu'il est arrive, jamais modifie
        interim/
      outputs/
        tables/
        figures/
      R/
        read_register.R
        indicator_table.R
      renv.lock
      README.md
      .gitignore
    Notes du présentateur
    Un projet RStudio est un répertoire contenant un fichier .Rproj. Ouvrir le projet fixe le répertoire de travail sur ce répertoire — c'est tout le mécanisme, mais il suffit à rendre chaque chemin de votre code relatif au projet plutôt qu'à votre dossier personnel.
  8. Diapositive 8 / 26

    Le projet

    • data/raw est en lecture seule — L'export tel qu'il est arrivé est la seule chose que vous ne pouvez pas reproduire ;…
    Notes du présentateur
    data/raw est en lecture seule. L'export tel qu'il est arrivé est la seule chose que vous ne pouvez pas reproduire ; tout le reste est régénéré en réexécutant le code. Il n'est donc jamais modifié, jamais trié dans Excel « juste pour regarder », et une correction se pose à côté de l'original sous un nouveau nom versionné plutôt que de le remplacer.
  9. Diapositive 9 / 26

    here() plutôt qu'un chemin relatif — En R

    library(here)
    
    muac <- readr::read_csv(here("data", "raw", "muac-screening-artibonite-2024.v1.csv"))
    Notes du présentateur
    Un chemin relatif comme "data/raw/muac.csv" fonctionne depuis la racine du projet et casse dans un notebook, dans un document R Markdown compilé depuis un sous-répertoire, ou lorsqu'on exécute une ligne à la fois depuis un autre emplacement.
  10. Diapositive 10 / 26

    here() plutôt qu'un chemin relatif — En R

    here()
    #> [1] "/home/marie/muac-analysis"
    Notes du présentateur
    here() trouve la racine du projet — le répertoire contenant le .Rproj, ou un fichier .here, ou un répertoire .git — et construit le chemin à partir de là. Le résultat est le même d'où que le code soit lancé. Appelez here() une fois en tête de script et utilisez-le partout. Un chemin construit par paste0() avec un / ne fonctionnera pas sous Windows ; here() gère le séparateur.
  11. Diapositive 11 / 26

    renv : les versions de paquets, consignées — En R

    install.packages("renv")
    
    renv::init()       # une fois par projet
    Notes du présentateur
    here() règle les chemins. Il ne fait rien pour les paquets, et ce sont les paquets qui font bouger le chiffre.
  12. Diapositive 12 / 26

    renv : les versions de paquets, consignées — En R

    renv::snapshot()   # apres toute installation ou mise a jour
    renv::restore()    # sur une autre machine, ou un an plus tard
    Notes du présentateur
    renv::init() donne au projet sa propre bibliothèque et écrit renv.lock, un relevé de chaque paquet et de sa version exacte. Ensuite :
  13. Diapositive 13 / 26

    renv : les versions de paquets, consignées

    • Versionnez renv.lock — C'est la différence entre « installez le tidyverse » et « installez les versions qui ont…
    • Installer là où il n'y a pas d'internet
    Notes du présentateur
    Versionnez renv.lock. C'est la différence entre « installez le tidyverse » et « installez les versions qui ont produit ce tableau ». La partie que la plupart des tutoriels sautent, et celle qui compte sur un déploiement. Sur une machine connectée, téléchargez les sources une fois :
  14. Diapositive 14 / 26

    renv : les versions de paquets, consignées — En R

    renv::init()
    renv::snapshot()
    
    # Remplir un cache local avec tout ce que nomme le fichier de verrouillage.
    renv::install()
    renv::isolate()
  15. Diapositive 15 / 26

    renv : les versions de paquets, consignées — En R

    # Sur la machine connectee
    dir.create("pkgs")
    download.packages(c("dplyr", "readr", "haven"), destdir = "pkgs", type = "source")
    
    # Sur la machine hors ligne
    install.packages(
      c("dplyr", "readr", "haven"),
      repos = NULL,
      type = "source",
      contriburl = paste0("file://", normalizePath("pkgs"))
    )
    Notes du présentateur
    Copiez ensuite le répertoire du projet — renv/library compris — vers le portable de terrain. renv::restore() utilisera ce qui est déjà présent plutôt que de chercher un dépôt qu'il ne peut pas voir. Pour une machine ayant besoin de paquets non encore installés, le mécanisme général est un dépôt local : Les paquets sources exigent un compilateur pour tout ce qui contient du C ou du C++, ce qui est fréquent. Si les machines de terrain sont sous Windows, téléchargez plutôt les binaires (type = "win.binary") depuis une machine Windows de même version de R.
  16. Diapositive 16 / 26

    Charger les paquets — En R

    library(readr)
    library(dplyr)
  17. Diapositive 17 / 26

    Charger les paquets

    • N'utilisez pas require() dans un script — Il renvoie FALSE et poursuit quand le paquet est absent : le script…
    • N'appelez pas install.packages() depuis un script — Un script qui installe des logiciels comme effet de bord est un…
    Notes du présentateur
    Deux choses à ne pas faire : N'utilisez pas require() dans un script. Il renvoie FALSE et poursuit quand le paquet est absent : le script échoue donc plus loin, sur une erreur déroutante concernant un objet inexistant. library() s'arrête sur place et vous dit quel paquet manque. N'appelez pas install.packages() depuis un script. Un script qui installe des logiciels comme effet de bord est un script que personne ne peut relancer sans risque. L'installation, c'est renv::restore(), une fois, délibérément. Là où deux paquets exportent le même nom — dplyr::filter() et stats::filter(), dplyr::lag() et stats::lag() — dites lequel vous voulez :
  18. Diapositive 18 / 26

    Charger les paquets — En R

    muac |> dplyr::filter(muac_mm < 125)
    Notes du présentateur
    La forme :: vaut ses quelques caractères dans un script qui survivra au souvenir que vous avez de ce qui était attaché.
  19. Diapositive 19 / 26

    Vérifier l'environnement avant de lui faire confiance — En R

    sessionInfo()
  20. Diapositive 20 / 26

    Vérifier l'environnement avant de lui faire confiance — En R

    stopifnot(getRversion() >= "4.2.0")
    stopifnot(requireNamespace("dplyr", quietly = TRUE))
    Notes du présentateur
    Pour une analyse dont les chiffres comptent, préférez l'assertion à l'inspection : |>, le tube natif employé dans tout ce cours, exige R 4.1 ou plus récent. Si votre équipe est sur un R plus ancien, %>% de magrittr fait le même travail et le code de ces leçons fonctionne tel quel avec lui.
  21. Diapositive 21 / 26

    Ce qu'il faut remettre à un collègue

    À versionnerÀ ne pas versionner
    R/, .Rprojrenv/library/
    renv.lockdata/raw/ — voir ci-dessous
    README.mdoutputs/
    .gitignore.Rhistory, .RData
  22. Diapositive 22 / 26

    Ce qu'il faut remettre à un collègue — Exemple

    .Rproj.user/
    .Rhistory
    .RData
    renv/library/
    data/raw/
    outputs/
  23. Diapositive 23 / 26

    Ce qu'il faut remettre à un collègue

    • Ne versionnez jamais de données brutes de bénéficiaires — identifiées ou pseudonymisées
    Notes du présentateur
    Ne versionnez jamais de données brutes de bénéficiaires, identifiées ou pseudonymisées. Git conserve chaque version de chaque fichier pour toujours, et un dépôt interne le lundi peut être partagé le vendredi. Les identifiants de connexion — jeton DHIS2, clé KoboToolbox — n'apparaissent jamais dans un script :
  24. Diapositive 24 / 26

    Ce qu'il faut remettre à un collègue — En R

    token <- Sys.getenv("DHIS2_TOKEN")
    stopifnot(nzchar(token))
    Notes du présentateur
    Gardez la valeur dans un fichier .Renviron couvert par .gitignore, et documentez le nom de la variable — non sa valeur — dans le README.
  25. Diapositive 25 / 26

    Ce qui vient ensuite

    • Le projet se rouvre et les paquets sont épinglés.
    Notes du présentateur
    Le projet se rouvre et les paquets sont épinglés. La leçon suivante y fait entrer un export : readr pour le CSV, readxl pour Excel, et la spécification de colonnes qui empêche un code de formation sanitaire de devenir un nombre.
  26. Diapositive 26 / 26

    La suite

    Lire la leçon complète, avec le code exécutable Retour à la leçon