From 4d7dc2f563edb77e696a86ce23b6c4d5c34f47ce Mon Sep 17 00:00:00 2001 From: EricMarcon Date: Mon, 13 Dec 2021 14:29:36 +0000 Subject: [PATCH] EricMarcon published a site update --- chap-ci.html | 12 ++ chap-conclusion.html | 16 +- chap-package.html | 19 +- chap-rediger.html | 12 +- chap-shiny.html | 178 ++++++++--------- chap-utiliseR.html | 129 +++++++------ index.html | 2 +- profile.html | 2 +- search_index.json | 2 +- travailleR.pdf | Bin 5133328 -> 5136111 bytes travailleR.tex | 181 ++++++++++-------- .../figure-html/r-parallele-1.png | Bin 43257 -> 44107 bytes .../figure-html/unnamed-chunk-17-1.png | Bin 41218 -> 42633 bytes .../figure-html/unnamed-chunk-17-2.png | Bin 28563 -> 31223 bytes .../figure-html/unnamed-chunk-41-1.png | Bin 39156 -> 40543 bytes .../figure-html/unnamed-chunk-51-1.png | Bin 38525 -> 36482 bytes .../figure-html/unnamed-chunk-53-1.png | Bin 30925 -> 49112 bytes 17 files changed, 300 insertions(+), 253 deletions(-) diff --git a/chap-ci.html b/chap-ci.html index e2e42c8..aca1e78 100644 --- a/chap-ci.html +++ b/chap-ci.html @@ -848,6 +848,18 @@

6.3.3 Articles et présentations<

L’étape chargée du tricot utilise un script pour lister tous les fichiers .Rmd, les traiter (tous les formats de sortie listés dans leur entête yaml sont produits). La fonction build_githubpages() (voir section 4.3.2) place les résultat dans docs.

La tâche de déploiement indique aux pages GitHub d’utiliser Jekyll, c’est-à-dire d’utiliser le fichier README.md comme page d’accueil.

+

Si l’étape de tricot nécessite de modifier la langue utilisée par R, par exemple pour afficher correctement la date de production des documents, elle peut être modifiée comme ceci:

+
      - name: Render Rmarkdown files
+        run: |
+          Sys.setlocale("LC_TIME", "fr_FR")
+          lapply(list.files(pattern="*.Rmd"), function(file) rmarkdown::render(file, "all"))
+          memoiR::build_githubpages()
+        shell: Rscript {0}
+

La sélection des fichiers est ici réalisée par un script R, qui inclut une commande de localisation, ici en Français.

+

Cette étape peut être complétée par la sélection d’un thème GitHub Pages pour que la page d’accueil contienne un lien vers le code:

+
        run: |
+          echo 'theme: jekyll-theme-slate' > docs/_config.yml
+

Le thème est ici “Slate”, un des choix proposés par les pages GitHub.

6.3.4 Site web blogdown

diff --git a/chap-conclusion.html b/chap-conclusion.html index 4930501..44b3fbc 100644 --- a/chap-conclusion.html +++ b/chap-conclusion.html @@ -432,14 +432,14 @@

9 Conclusion

La présentation des résultats est assurée par les pages GitHub et des modèles de documents couvrant la majorité des besoins.

Pour les pauses, R fournit même quelques jeux dans le package fun, dont le célèbre démineur:

-
# Installation du package
-install.packages("fun")
-# Ouverture d'une fenêtre X et exécution
-if (interactive()) {
-    if (.Platform$OS.type == "windows")
-        x11() else x11(type = "Xlib")
-    fun::mine_sweeper()
-}
+
# Installation du package
+install.packages("fun")
+# Ouverture d'une fenêtre X et exécution
+if (interactive()) {
+    if (.Platform$OS.type == "windows")
+        x11() else x11(type = "Xlib")
+    fun::mine_sweeper()
+}

Ce document n’a pas pour objectif d’être exhaustif sur les possibilités de R mais plutôt de présenter une méthode de travail et des moyens simples de l’appliquer rapidement. On se reportera aux ouvrages plus détaillés cités dans le texte pour approfondir tel ou tel point.

diff --git a/chap-package.html b/chap-package.html index 1a59bda..4f0c90f 100644 --- a/chap-package.html +++ b/chap-package.html @@ -701,7 +701,7 @@

5.3 Vignette et pkgdown

subtitle: "Multiples of numbers"

Le reste de l’entête permet à R de construire la vignette à partir de code R Markdown.

Le corps de la vignette contient par défaut du code R pour déclarer les options de présentation des bouts de code et le chargement du package. -Une introduction à l’utilisation du package doit être écrite dans ce documents, en R Markdown.

+Une introduction à l’utilisation du package doit être écrite dans ce document, en R Markdown.

Le package pkgdown permet de créer un site d’accompagnement du package96, qui reprend le fichier README.md comme page d’accueil, la vignette dans une rubrique “Get Started”, l’ensemble des fichiers d’aide avec leurs exemples exécutés (section “Reference”), le fichier NEWS.md pour un historique du package (section “Changelog”) et des informations du fichier DESCRIPTION.

Créer le site avec usethis

@@ -815,7 +815,7 @@

5.4.2.2 Méthodes

plot
## function (x, y, ...) 
 ## UseMethod("plot")
-## <bytecode: 0x7f9780f6c710>
+## <bytecode: 0x7ffd8013f748>
 ## <environment: namespace:base>

Il existe dans R de nombreuses déclinaisons de plot qui sont des fonctions dont le nom est de la forme plot.class(). @@ -962,13 +962,13 @@

5.4.3.1 Création d’une méthod triple(2L))

## Unit: nanoseconds
 ##                expr  min     lq     mean median     uq
-##  triple.integer(2L)  324  335.0 27086.02    352  389.5
-##   triple.numeric(2)  324  337.0 23376.28    352  395.0
-##          triple(2L) 1306 1341.5  1967.55   1378 1445.5
+##  triple.integer(2L)  316  326.0 21957.52  336.0  370.5
+##   triple.numeric(2)  314  328.5 18749.92  337.5  386.0
+##          triple(2L) 1279 1309.5  1409.66 1334.0 1392.0
 ##      max neval
-##  2667049   100
-##  2299345   100
-##    49769   100
+## 2160145 100 +## 1838588 100 +## 5510 100

La mesure des performances par le package microbenchmark ne montre pas de différence entre les fonctions triple.integer() et triple.numeric comme attendu parce que le temps consacré au calcul lui-même est négligeable en comparaison du temps d’appel de la fonction. La méthode générique consomme beaucoup plus de temps que les calculs très simples ici. @@ -1440,6 +1440,9 @@

5.10.1 Test du package

Le site R-hub builder101 permet de le faire simplement.

Le package, dont la version ne doit pas être de développement (limitée à trois nombres, voir section 5.2.1), doit être construit au format source: dans la fenêtre Build de RStudio, cliquer sur “More > Build Source Package”. Sur le site R-hub builder, cliquer sur “Advanced”, sélectionner le fichier source du package et la plateforme de test: Debian Linux, R-devel, GCC.

+

Le package rhub permet d’utiliser la même plateforme de vérification que le site R-hub builder depuis RStudio. +La première étape consiste à valider son adresse de messagerie avec la commande validate_email(). +Ensuite, il suffit d’appeler la fonction check_for_cran() pour lancer une vérification complète.

5.10.2 Soumission

diff --git a/chap-rediger.html b/chap-rediger.html index ea0cf74..5227bef 100644 --- a/chap-rediger.html +++ b/chap-rediger.html @@ -772,7 +772,7 @@

4.3.1.3 Tableaux

# Sélection des longs sépales (>5) et affichage en # rouge color(~Sepal.Length > 5, ~Sepal.Length, color = "red")
- -
+
+

Longueur sépales

Largeur

Longueur pétales

Largeur

Espèce

5.1

3.5

1.4

0.2

setosa

4.9

3.0

1.4

0.2

setosa

4.7

3.2

1.3

0.2

setosa

4.6

3.1

1.5

0.2

setosa

5.0

3.6

1.4

0.2

setosa

5.4

3.9

1.7

0.4

setosa

+
+
tar_make()
## ✔ skip target NbPoints
 ## ✔ skip target X
diff --git a/index.html b/index.html
index 8a69840..197a220 100644
--- a/index.html
+++ b/index.html
@@ -427,7 +427,7 @@ 

Présentation

diff --git a/profile.html b/profile.html index 3df41dc..1ca5b15 100644 --- a/profile.html +++ b/profile.html @@ -4288,7 +4288,7 @@
- + diff --git a/search_index.json b/search_index.json index a275791..85ef166 100644 --- a/search_index.json +++ b/search_index.json @@ -1 +1 @@ -[["index.html", "Travailler avec R Présentation Objectifs Conventions", " Travailler avec R Eric Marcon 28/11/2021 Présentation Objectifs Ce document est le support du cours Travailler avec R. Il propose une organisation du travail autour de R et RStudio pour, au-delà des statistiques, rédiger des documents efficacement avec R Markdown, aux formats variés (mémos, articles scientifiques, mémoires d’étudiants, livres, diaporamas), créer son site web et des applications R en ligne (Shiny), produire des packages et utiliser R pour l’enseignement. Il complète Reproducible Research with R and R Studio (Gandrud 2015) par une approche plus concrète, avec des solutions prêtes à l’emploi. L’optimisation de l’utilisation des nombreux outils disponibles est traitée en détail: rmarkdown, bookdown et blogdown pour la rédaction, roxygen2, testthat et pkgdown pour les packages, le contrôle de source avec git et GitHub, l’intégration continue avec les Actions GitHub et Codecov. Des exemples sont présentés à chaque étape, et le code nécessaire est fourni. Le chapitre 1 est consacré à l’installation des outils nécessaires : R, git et LaTeX. Le chapitre 2 détaille quelques aspects avancés de l’utilisation de R: les différents langages, les environnements, la performance du code. L’utilisation de base de R n’est pas reprise ici: de bons cours sont suggérés. Le chapitre 3 présente le contrôle de source avec git et GitHub. Le chapitre 4 montre comment rédiger des documents simples (articles) ou complexes (ouvrages) avec R Markdown, intégrant les données, le code pour les traiter et le texte pour les présenter. Le chapitre 5 présente une méthode pas à pas pour créer efficacement un package. Le chapitre 6 introduit l’utilisation de l’intégration continue pour produire automatiquement des documents, vérifier le code des packages et produire leurs vignettes. Le chapitre 7 présente Shiny, l’outil de mise en ligne d’applications R. Enfin, le chapitre 8 introduit les outils destinés à l’enseignement de et avec R. Conventions Les noms des packages sont en gras dans le texte, exemple: ggplot2. L’identifiant utilisé sur GitHub est noté GitHubID. Le signe |> dans le code des exemples indique que la suite du code devrait se trouver sur la même ligne, mais est coupée pour le formatage de ce document. Son usage est limité aux fichiers de configuration YAML, surtout utilisés dans le chapitre 6. Dans tous les autres cas, le code peut être utilisé directement. References "],["chap-logiciels.html", "1 Logiciels 1.1 R 1.2 RStudio 1.3 Packages 1.4 git et GitHub 1.5 MiKTeX 1.6 Zotero 1.7 Go", " 1 Logiciels L’outil central est évidemment R, mais son fonctionnement est aujourd’hui difficilement envisageable sans son environnement de développement RStudio. Pour le contrôle de source, git et GitHub sont de fait les standards. L’ensemble doit être complété par une distribution LaTeX pour la production de documents au format PDF. Un outil de gestion bibliographique est indispensable: Zotero et son extension Better BibTeX sont parfaitement adaptés au cadre de travail présenté ici. Enfin, d’autres logiciels d’usage plus ponctuel peuvent être nécessaires, comme Go. Leur installation et leur organisation cohérente sont présentées dans ce chapitre. 1.1 R 1.1.1 Installation R est inclus dans les distributions de Linux: le paquet est nommé r-base. Il ne contient pas des outils de développement souvent nécessaires, donc il est préférable d’installer aussi le paquet r-base-dev. La version de R est souvent un peu ancienne. Pour disposer de la dernière version, il faut utiliser un miroir de CRAN comme source des paquets : voir la documentation complète pour Ubuntu1. Sous Windows ou Mac, installer R après l’avoir téléchargé depuis CRAN2. 1.1.2 Rtools Sur Mac, l’installation de R est suffisante à partir de la version 4.0.0. Sous Windows, l’installation doit être complétée par les “Rtools”, qui contiennent les outils de développement dont ceux nécessaires à la compilation des packages contenant du code C++. Le chemin des Rtools doit être déclaré à R, en exécutant dans la console de RStudio la commande suivante (adaptée à la version 4.0 des Rtools): # Rtools : déclaration du chemin, # nécessite de redémarrer RStudio writeLines('PATH="${RTOOLS40_HOME}\\\\usr\\\\bin;${PATH}"', con = "~/.Renviron") Les Rtools doivent être complétés par quelques utilitaires manquants, à installer quand le besoin apparaît (en général, un avertissement de R indiquant que le logiciel n’est pas installé). La vérification des packages renvoie un avertissement si qpdf3 n’est pas installé. Télécharger le fichier zip et coller tout le contenu du dossier bin dans le dossier usr/bin de Rtools (C:\\Rtools40\\usr\\bin pour la version 4.0). Un autre avertissement est renvoyé en absence de Ghostscript4 à télécharger et installer. Copier ensuite le contenu du dossier bin dans le dossier usr/bin de Rtools. 1.1.3 Mise à jour Il est conseillé d’utiliser la dernière version mineure de R: par exemple, 4.0.x jusqu’à la sortie de la version 4.1. Il est obligatoire d’utiliser la toute dernière version pour préparer un package soumis à CRAN. Des changements importants ont lieu entre les versions majeures (la version 4 ne permet pas d’utiliser un package compilé pour la version 3) mais aussi parfois entre versions mineures (un fichier de données binaires .rda enregistré sous la version 3.3 ne peut pas être lu par la version 3.6). Il est donc utile de mettre R à jour régulièrement. L’installation d’une nouvelle version ne désinstalle par automatiquement les versions anciennes, ce qui permet d’en utiliser plusieurs en cas de besoin (par exemple, si un package ancien et indispensable n’est plus disponible). En usage courant, il est préférable de désinstaller manuellement les anciennes versions après l’installation d’une nouvelle. 1.1.4 Librairies Les packages de R se trouvent dans deux dossiers: la bibliothèque système (System Library) contient les packages fournis avec R : base, utils, graphics par exemple. Elle se trouve dans un sous-répertoire du programme d’installation (C:\\Program Files\\R\\R-4.0.0\\library pour R version 4.0.0 sous Windows 10). La bibliothèque utilisateur (User Library) contient ceux installés par l’utilisateur. Elle se trouve dans le dossier personnel de l’utilisateur, dans un sous-dossier R\\win-library\\4.0\\). Si le dossier personnel de l’utilisateur est sauvegardé (par exemple, s’il est répliqué dans le cloud par OneDrive sous Windows), il n’est pas optimal d’y placer les packages: le trafic généré par leur sauvegarde serait lourd et inutile. Pour que les packages soient installés automatiquement dans la bibliothèque système, il suffit que l’utilisateur y ait le droit d’écrire. Sous Windows, donner le droit “Modifier” au groupe des utilisateurs de l’ordinateur sur le dossier de la bibliothèque, en plus du droit de lecture par défaut 1.1). Figure 1.1: Activation du droit de modifier la bibliothèque système sous Windows. Si la bibliothèque utilisateur est retenue, il faut penser à vider le dossier correspondant à l’ancienne version de R en cas changement de version mineure. L’emplacement des librairies est donné par la fonction .libPaths(): .libPaths() ## [1] "/Users/runner/work/_temp/Library" ## [2] "/Library/Frameworks/R.framework/Versions/4.1/Resources/library" 1.2 RStudio RStudio est une interface graphique pour R et bien plus: il est conçu pour simplifier la gestion des projets, faciliter la rédaction et la production de documents et intégrer le contrôle de source par exemple. 1.2.1 Installation Installer la dernière version de RStudio Desktop à partir du site de RStudio5. Une commande est disponible dans le menu “Help” de RStudio pour vérifier l’existence d’une version plus récente, à installer. 1.2.2 Encodage des fichiers Les fichiers manipulés dans R sont très majoritairement des fichiers texte. Les caractères spéciaux, notamment les accents, peuvent être codés de diverses façons mais la déclaration du codage n’est pas intégrée aux fichiers. Le codage par défaut dépend du système d’exploitation, ce qui pose régulièrement des problèmes de lisibilité des fichiers partagés. Le codage UTF8 est devenu le standard parce qu’il est universellement reconnu et supporte tous les alphabets sans ambiguïtés. Dès la première utilisation de RStudio, créer un nouveau fichier R (menu “File > New File > R Script”), l’enregistrer au format UTF8 (“File > Save with Encoding…”), choisir UTF8 dans la liste des formats et cocher la case “Set as default encoding for source files”. Supprimer le fichier après l’avoir enregistré. Les nouveaux fichiers seront codés au format UTF8. Les fichiers codés sous un autre format ne s’afficheront pas correctement: ils pourront être réouverts avec leur codage d’origine (“File > Reopen with Encoding…”), en essayant éventuellement plusieurs codages jusqu’à obtenir un affichage correct, et sauvegardés au format UTF8 ensuite. 1.2.3 Dossier de travail Le dossier de travail par défaut est le dossier personnel de l’utilisateur, appelé ~ par RStudio: Sys.getenv("R_USER") ## [1] "" Mes Documents sous Windows; Home sous Mac ou Linux. Il faut systématiquement travailler dans des sous-dossiers de ~, par exemple : ~\\Formation. Pour le bon fonctionnement des RTools, le nom complet du répertoire de travail ne doit pas contenir d’espace (utiliser les tirets bas _) ni de caractère spécial. Le dossier de travail en cours est obtenu par la commande getwd(). getwd() ## [1] "/Users/runner/work/travailleR/travailleR" L’utilisation du contrôle de source (voir chapitre 3) crée de nombreux fichiers de travail. Les projets sous contrôle de source ne devraient pas se trouver dans un dossier déjà sauvegardé par un autre moyen, comme un lecteur OneDrive sous Windows, sous peine d’une utilisation excessive des ressources: chaque validation de modifications engendre la sauvegarde des fichiers modifiés, mais aussi des fichiers de contrôle qui peuvent être de grande taille. 1.2.4 Solution retenue L’organisation de l’environnement travail est une affaire personnelle, qui dépend des préférences de chacun. L’organisation proposée ici n’est qu’une possibilité, à adapter à ses propres choix, mais en respectant les contraintes mentionnées. Sous Windows, une organisation optimale est la suivante: Dans son dossier personnel (Mes Documents, ~ pour R), un dossier R est utilisé pour les projets simples, sans contrôle de source. La sauvegarde de ce dossier est gérée par ailleurs. Un dossier hors du dossier personnel est utilisé pour les projets sous contrôle de source. L’utilisateur doit y avoir le droit d’écrire. Dans l’organisation de Windows, le dossier correspondant à ces critères est %LOCALAPPDATA%, typiquement C:\\Users\\NomUtilisateur\\AppData\\Local. Le dossier sera donc %LOCALAPPDATA%\\ProjetsR à créer: exécuter md %LOCALAPPDATA%\\ProjetsR dans une invite de commande. Epingler ce dossier à l’accès rapide de l’explorateur de fichiers (figure 1.2): coller %LOCALAPPDATA%\\ProjetsR dans la barre d’adresse de l’explorateur de fichiers, valider, puis faire un clic droit sur “Accès Rapide” et épingler le dossier. Figure 1.2: Dossier pour les projets sous contrôle de source, sous Windows. 1.3 Packages 1.3.1 Installation depuis CRAN L’installation classique des packages fait appel à CRAN. Un bouton “Install” se trouve dans la fenêtre Packages de RStudio. Les packages sont déposés sur CRAN par leurs auteur sous forme de code source, compressé dans une fichier .tar.gz. Ils sont disponibles pour le téléchargement dès leur validation. Ils doivent ensuite être mis au format binaire pour Windows (dans un fichier .zip), ce qui prend un peu de temps. A la demande de l’installation d’un package sous Windows, CRAN propose la version source plutôt que la version binaire si elle est plus récente 1.3). Figure 1.3: Activation du droit de modifier la bibliothèque système sous Windows. La liste des packages concernés est affichée dans la console, par exemple: There are binary versions available but the source versions are later: binary source needs_compilation boot 1.3-24 1.3-25 FALSE class 7.3-16 7.3-17 TRUE Certains packages nécessitent une compilation (colonne needs_compilation), en général parce qu’ils contiennent du code C++. Ils ne pourront être installés que par les Rtools. L’installation des packages en version source est beaucoup plus longue qu’en version binaire. Sauf si une version précise d’un package est nécessaire, il est donc préférable de refuser l’installation des versions source. Les packages peuvent être mis à jour un peu plus tard, après leur compilation par CRAN. Le bouton “Update” dans la fenêtre Packages de RStudio permet de mettre à jour tous les packages installés. 1.3.2 Installation depuis GitHub Certains packages ne sont pas disponibles sur CRAN mais seulement sur GitHub parce qu’ils sont encore en développement ou parce qu’ils ne sont pas destinés à un large usage par la communauté des utilisateurs de R. Il peut aussi être utile d’installer une version de développement d’un package publié sur CRAN pour un usage ponctuel comme le test de nouvelles fonctionnalités. L’installation est gérée par le package remotes. L’argument build_vignettes est nécessaire pour créer les vignettes du package. remotes::install_github("EricMarcon/memoiR", build_vignettes = TRUE) Le nom du package est entré sous la forme “GitHubID/NomduPackage”. L’installation est faite à partir du code source et nécessite donc les Rtools si une compilation est nécessaire. install_github() vérifie que la version sur GitHub est plus récente que l’éventuelle version installée sur le poste de travail et ne fait rien si elles sont identiques. 1.3.3 Installation depuis Bioconductor Bioconductor est une plateforme complémentaire de CRAN qui héberge des packages spécialisés dans la génomique. L’installation des packages de Bioconductor nécessite le package BiocManager pour sa fonction install(). Le premier argument de la fonction est un vecteur de caractères contenant les noms des packages à installer, par exemple: BiocManager::install(c("GenomicFeatures", "AnnotationDbi")) La fonction install() appelée sans arguments met à jour les packages. 1.3.4 Solution retenue A chaque mise à jour mineure de R, tous les packages doivent être réinstallés. La façon la plus efficace de le faire est de créer un script Packages.R à placer dans ~\\R. Il contient une fonction qui vérifie si chaque package est déjà installé pour ne pas le refaire inutilement. # Installation des packages de R #### # Installer les packages si nécessaire #### InstallPackages <- function(Packages) { sapply(Packages, function(Package) if (!Package %in% installed.packages()[, 1]) {install.packages(Package)}) } # Outils de développement #### InstallPackages(c( # Outils de développement. Importe remotes, etc. "devtools", # Exécution de Check par RStudio "rcmdcheck", # Formatage du code R (utilisé par knitr) "formatR", # Documentation des packages dans /docs sur GitHub "pkgdown", # Bibliographie avec roxygen "Rdpack", # Mesure des performances "rbenchmark", # Documentation automatique des packages "roxygen2", # Tests des packages "testthat" )) # Markdown #### InstallPackages(c( # Tricot "knitr", # Documents markdown complexes "bookdown", # Sites web "blogdown", # Modèles de documents "memoiR" )) # Tidyverse #### InstallPackages("tidyverse") # Mes packages #### # EcoFoG remotes::install_github("EcoFoG/EcoFoG", build_vignettes = TRUE) La dernière partie du script est à compléter avec les packages utilisés régulièrement. Ce script est à exécuter à chaque mise à jour de R, après avoir éventuellement activé le droit d’écriture dans la librairie système (voir section 1.1.4). 1.4 git et GitHub 1.4.1 git git est le logiciel de contrôle de source utilisé ici. Son utilisation est détaillée dans le chapitre 3. Pour Windows et Mac, l’installation a lieu à partir du site web de git6. git est intégré dans les distributions Linux. Pour Ubuntu, le package apt est git-all. git est installé sans interface graphique, fournie par RStudio. Dans RStudio, modifier les options globales (menu “Tools > Global Options…”). Sélectionner Terminal et l’option New Terminals open with: GitBash. Vérifier la bonne installation de git en tapant la commande git -h dans le terminal de RStudio: l’aide doit s’afficher. Après l’installation de git, il est possible que le terminal de RStudio ne fonctionne plus correctement et renvoie un message d’erreur contenant les éléments suivants: *** fatal error - cygheap base mismatch detected This problem is probably due to using incompatible versions of the cygwin DLL. Le message d’erreur est imprécis: la librairie qui ne doit exister qu’en un seul exemplaire n’est pas cygwin1.dll mais msys-2.0.dll. Rechercher ce fichier dans les dossier d’installation de git et de Rtools. Ils se trouvent normalement dans usr/bin. Remplacer celui de git par celui de Rtools: la version des deux fichiers doit être identique. Entrer ses informations d’identification en exécutant les commandes suivantes dans le terminal: git config user.name git config user.email Le nom d’utilisateur est libre, de préférence “Prénom Nom”. 1.4.2 GitHub GitHub est la plateforme accessible par un site web qui permet de partager le contenu des dépôts git. Pour l’utiliser, il suffit d’ouvrir un compte avec la même adresse de messagerie que celle enregistrée dans git. Le nom du compte GitHub est noté ici GitHubID. Chaque compte GitHub permet d’héberger des dépôts (un dépôt contient les fichiers d’un projet) à l’adresse https://github.com/GitHubID/NomDuDepot7. Chaque dépôt peut disposer d’un site web à l’adresse https://GitHubID.github.io/NomDuDepot/8. Enfin, un site web global est prévu pour chaque utilisateur à l’adresse https://GitHubID.github.io/9. 1.4.3 Authentification SSH La communication entre git (installé sur l’ordinateur local) et GitHub (plateforme en ligne) nécessite de s’authentifier. Deux méthodes sont disponibles: HTTPS (aussi appelée SSL) et SSH. SSH est la plus robuste mais nécessite la création d’une clé privée. Dans le terminal de RStudio, exécuter: ssh-keygen -t ed25519 -C "user.email" L’adresse de messagerie doit être celle enregistrée dans la configuration de git et le compte GitHub. La clé est enregistrée dans le dossier .ssh du répertoire personnel de l’utilisateur. Il est possible d’ajouter un mot de passe (passphrase) à la clé, qui devra être tapé à la première utilisation de chaque session de travail. Si l’ordinateur est correctement sécurisé (pas d’accès physique par des tiers), la laisser vide permet de gagner en fluidité. Attention: la clé privée est strictement confidentielle et ne doit être copiée nulle part où elle pourrait être lue par un tiers (attention aux sauvegardes automatiques notamment). Elle n’a pas besoin d’être bien sauvegardée: en cas de perte, elle sera remplacée facilement. Dans le dossier .ssh, deux fichiers sont créés: l’un contient la clé privée, l’autre, avec l’extension .pub, la clé publique correspondante. Ouvrir le second avec un éditeur de texte et copier la clé publique dans le presse-papier. Sur GitHub, afficher les réglages de son compte (menu “Settings”), sélectionner “SSH and GPG Keys”, cliquer sur “New SSH Key” et coller la clé dans le champ “Key”. Donner un nom à la clé dans le champ “Title”. Le nom peut être celui de l’ordinateur sur lequel la clé a été créée. La clé ne doit pas être copiée sur plusieurs ordinateurs: en cas de besoin, créer une nouvelle clé sur chaque poste de travail utilisé. Dans le terminal de RStudio, vérifier le bon fonctionnement de la clé: ssh -T git@github.com Un message indique que l’authenticité du serveur GitHub ne peut pas être vérifiée: un contrôle manuel est nécessaire pour la première connexion. Vérifier auprès de GitHub que l’empreinte du serveur est correcte10 et taper yes. Le serveur est ajouté automatiquement à la liste des serveurs connus, dans le fichier known_hosts. Si la clé est compromise (perte ou prêt de l’ordinateur qui la contient), la supprimer sur GitHub et en créer une nouvelle. 1.4.4 Obtention d’un jeton d’accès personnel L’authentification HTTPS est l’alternative à l’authentification SSL: il faut choisir une méthode et s’y tenir par la suite. Pour utiliser l’authentification HTTPS, la création d’un jeton d’accès personnel est nécessaire. Les jetons sont créés sur GitHub, dans les paramètres de son compte d’utilisateur, dans “Developer Settings > Personal Access Tokens”11. Générer un nouveau jeton, le décrire en tant que “git-RStudio” et lui donner l’autorisation “repo”, c’est-à-dire modifier tous les dépôts (il n’est pas possible de limiter l’accès à un dépôt particulier). Le jeton est une chaîne de caractère qui ne pourra pas être relue plus tard: elle doit être sauvegardée comme un mot de passe. 1.5 MiKTeX Pour produire des documents au format PDF, une distribution Latex est nécessaire. La solution légère consiste à installer le package tinytex: sa fonction install_tinytex() installe une distribution LaTeX optimisée pour R Markdown. Une distribution complète est préférée ici parce qu’elle permet l’utilisation de Latex au-delà de RStudio. MiKTeX12 est une très bonne solution pour Windows et Mac. 1.5.1 Installation Télécharger le fichier d’installation et l’exécuter. Plusieurs choix sont à faire pendant l’installation: Installer le programme pour tous les utilisateurs (avec des droits d’administrateur); Le format par défaut du papier: choisir A4; Le mode d’installation des packages manquants: choisir “Always Install” pour qu’ils soient téléchargés automatiquement en cas de besoin. Pour Linux, suivre les instructions sur le site de MiKTeX. 1.5.2 Mises à jour MiKTeX est installé avec les packages LaTeX les plus utilisés. Si un document nécessite un package manquant, il est chargé automatiquement. Les mises à jour de packages doivent être faites périodiquement avec la console MiKTeX, accessible dans le menu Démarrer. Quand elle est lancée sans élévation des privilèges, la console propose de passer en mode administrateur. Cliquer sur “Switch to Administrator mode”. Dans les paramètres (Settings), vérifier que les packages s’installent toujours automatiquement et que le format du papier est bien A4. Dans le menu des mises à jour (Updates), cliquer sur “Check for updates” puis “Update now”. Si l’installation automatique est défaillante, il est possible d’installer manuellement un package dans le menu “Packages”. 1.6 Zotero Zotero13 est le logiciel de gestion bibliographique le plus utilisé. Ses extensions permettent de compléter ses fonctionnalités selon les besoins de chacun. Better BibTeX permet d’exporter et de maintenir à jour une sélection des références bibliographiques (une collection de Zotero) sous la forme d’un fichier BibTeX dans un projet R, où il pourra être utilisé dans la rédaction de documents ou la documentation de packages. Télécharger le fichier d’installation et l’exécuter. Créer un compte utilisateur sur le site web de Zotero. Lier l’installation locale au compte: dans le menu “Edition > Préférences”, sélectionner “Synchronisation > Paramètres” et s’authentifier dans la zone “Synchronisation des données”. Cocher ensuite la case “Synchroniser automatiquement” mais pas “Synchroniser le texte intégral des pièces jointes indexées” parce que la taille totale des textes intégraux synchronisés de cette manière entre le compte Zotero en ligne et le poste de travail est limitée à 300 Mo. Télécharger l’extension Better BibTeX14 et l’installer avec le menu “Outils > Extensions”: cliquer sur le bouton des paramètres en haut à droite de la fenêtre, puis “Install Add-on From File…” et sélectionner le fichier qui vient d’être téléchargé. Paramétrer Better BibTeX à partir du menu “Edition > Préférences > Better BibTeX”. Les options à modifier sont les suivantes: “Clés de citation > Format de clé”: [auth:capitalize][year] pour que les citations disposent d’un identifiant unique de la forme “Nom2021”; “Clés de citation > Conserver les clés de citation unique dans”: “Toutes les collections” pour que les identifiants des citations ne soient pas ambigus. “Exportation > Gestion des Champs > Champs à exclure de l’exportation”: “abstract, file” pour ne pas générer des fichiers bibliographiques surchargés d’informations inutiles dans les projets R. Il est conseillé d’utiliser l’extension ZotFile15 pour mieux contrôler l’emplacement du texte intégral (les fichiers PDF liés au références bibliographiques). L’installer puis la paramétrer dans “Outils > Préférences de ZotFile…> Paramètres généraux > Emplacement des fichiers > Dossier personnalisé”: choisir le dossier de stockage des textes intégraux. Si le dossier personnel de l’utilisateur est sauvegardé (par exemple, s’il est répliqué dans le cloud par OneDrive sous Windows), y placer ce dossier de stockage permet à la fois de sauvegarder les textes intégraux mais aussi d’y accéder à partir de plusieurs postes de travail ou directement en ligne. Cette solution est bien plus efficace que la synchronisation par défaut de Zotero, limitée en volume. 1.7 Go Go16 n’est utilisé que par le générateur de sites web Hugo (voir section 4.7). Télécharger le fichier d’installation et l’exécuter. A la fin de l’installation, exécuter la commande go version dans un terminal pour vérifier son bon fonctionnement. Les mises à jour se font en installant la nouvelle version par dessus la précédente. https://doc.ubuntu-fr.org/r↩︎ https://cran.r-project.org/↩︎ https://sourceforge.net/projects/qpdf/↩︎ https://www.ghostscript.com/↩︎ https://rstudio.com/products/rstudio/download/↩︎ https://git-scm.com/↩︎ Exemple: https://github.com/EricMarcon/travailleR↩︎ Exemple: https://EricMarcon.github.io/travailleR/↩︎ Exemple: https://EricMarcon.github.io/↩︎ https://docs.github.com/en/github/authenticating-to-github/githubs-ssh-key-fingerprints↩︎ https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line↩︎ https://miktex.org/download↩︎ https://www.zotero.org/↩︎ https://retorque.re/zotero-better-bibtex/installation/↩︎ http://zotfile.com/↩︎ https://golang.org/↩︎ "],["chap-utiliseR.html", "2 Utiliser R 2.1 Les langages de R 2.2 Environnements 2.3 Mesure du temps d’exécution 2.4 Boucles 2.5 Code C++ 2.6 Paralléliser R 2.7 Etude de cas 2.8 Flux de travail", " 2 Utiliser R La documentation consacrée à l’apprentissage de R est florissante. Les ouvrages suivants sont une sélection arbitraire mais utile pour progresser: L’Introduction à R et au tidyverse (Barnier 2020) est un excellent cours de prise en main. Advanced R (Wickham 2014) est la référence pour maîtriser les subtilités du langage et bien comprendre le fonctionnement de R. R for Data Science (Wickham et Grolemund 2016) présente une méthode de travail complète, cohérente avec le tidyverse. Enfin, Efficient R programming (Gillespie et Lovelace 2016) traite de l’optimisation du code. Quelques aspects avancés du codage sont vus ici. Des précisions sur les différents langages de R sont utiles pour la création de packages. Les environnements sont présentés ensuite, pour la bonne compréhension de la recherche des objets appelés par le code. Enfin, l’optimisation des performances du code est traitée en détail (boucles, code C++ et parallélisation) et illustrée par une étude de cas. 2.1 Les langages de R R comprend plusieurs langages de programmation. Le plus courant est S3, mais ce n’est pas le seul17. 2.1.1 Base Le cœur de R est constitué des fonctions primitives et structures de données de base comme la fonction sum et les données de type matrix: pryr::otype(sum) ## [1] "base" typeof(sum) ## [1] "builtin" pryr::otype(matrix(1)) ## [1] "base" typeof(matrix(1)) ## [1] "double" Le package pryr permet d’afficher le langage dans lequel des objets sont définis. La fonction typeof() affiche le type de stockage interne des objets: la fonction sum() appartient au langage de base de R et est une fonction primitive (builtin); les éléments de la matrice numérique contenant un seul 1 sont des réels à double précision, et la matrice elle-même est définie dans le langage de base. Les fonctions primitives sont codées en C et sont très rapides. Elles sont toujours disponibles, quels que soient les packages chargés. Leur usage est donc à privilégier. 2.1.2 S3 S3 est le langage le plus utilisé, souvent le seul connu par les utilisateurs de R. C’est un langage orienté objet dans lequel les classes, c’est-à-dire le type des objets, sont déclaratives. MonPrenom <- "Eric" class(MonPrenom) <- "Prenom" La variable MonPrenom est ici de classe “Prenom” par une simple déclaration. Contrairement au fonctionnement d’un langage orienté objet classique18, les méthodes S3 sont liées aux fonctions, pas aux objets. # Affichage par défaut MonPrenom ## [1] "Eric" ## attr(,"class") ## [1] "Prenom" print.Prenom <- function(x) cat("Le prénom est", x) # Affichage modifié MonPrenom ## Le prénom est Eric Dans cet exemple, la méthode print() appliquée à la classe “Prenom” est modifiée. Dans un langage orienté objet classique, la méthode serait définie dans la classe Prenom. Dans R, les méthodes sont définies à partir de méthodes génériques. print est une méthode générique (“un générique”) déclaré dans base. pryr::otype(print) ## [1] "base" Son code se résume à une déclaration UseMethod(\"print\"): print ## function (x, ...) ## UseMethod("print") ## <bytecode: 0x7f9780e32bc8> ## <environment: namespace:base> Il existe beaucoup de méthodes S3 pour print: head(methods("print")) ## [1] "print.acf" "print.AES" ## [3] "print.all_vars" "print.anova" ## [5] "print.ansi_string" "print.ansi_style" Chacune s’applique à une classe. print.default est utilisée en dernier ressort et s’appuie sur le type de l’objet, pas sur sa classe S3. typeof(MonPrenom) ## [1] "character" pryr::otype(MonPrenom) ## [1] "S3" Un objet peut appartenir à plusieurs classes, ce qui permet une forme d’héritage des méthodes. Dans un langage orienté objet classique, l’héritage permet de définir des classes plus précises (“PrenomFrancais”) qui héritent de classes plus générales (“Prenom”) et bénéficient de cette façon de leurs méthodes sans avoir à les redéfinir. Dans R, l’héritage consiste simplement à déclarer un vecteur de classes de plus en plus larges pour un objet: # Définition des classes par un vecteur class(MonPrenom) <- c("PrenomFrancais", "Prenom") # Ecriture alternative, avec inherits() inherits(MonPrenom, what = "PrenomFrancais") ## [1] TRUE inherits(MonPrenom, what = "Prenom") ## [1] TRUE Le générique cherche une méthode pour chaque classe, dans l’ordre de leur déclaration. print.PrenomFrancais <- function(x) cat("Prénom français:", x) MonPrenom ## Prénom français: Eric En résumé, S3 est le langage courant de R. Presque tous les packages sont écrits en S3. Les génériques sont partout mais passent inaperçus, par exemple dans des packages: library("entropart") .S3methods(class = "SpeciesDistribution") ## [1] autoplot plot ## see '?methods' for accessing help and source code La fonction .S3methods() permet d’afficher toutes les méthodes disponibles pour une classe, par opposition à methods() qui affiche toutes les classes pour lesquelles la méthode passée en argument est définie. De nombreuses fonctions primitives de R sont des méthodes génériques. Utiliser l’aide help(InternalMethods) pour les découvrir. 2.1.3 S4 S4 est une évolution de S3 qui structure les classes pour se rapprocher d’un langage orienté objet classique: les classes doivent être définies explicitement, pas simplement déclarées; les attributs (c’est-à-dire les variables décrivant les objets), appelés slots, sont déclarés explicitement; le constructeur, c’est-à-dire la méthode qui crée un nouvelle instance d’une classe (c’est-à-dire une variable contenant un objet de la classe), est explicite. En reprenant l’exemple précédent, la syntaxe S4 est la suivante: # Définition de la classe Personne, avec ses slots setClass("Personne", slots = list(Nom = "character", Prenom = "character")) # Construction d'une instance Moi <- new("Personne", Nom = "Marcon", Prenom = "Eric") # Langage pryr::otype(Moi) ## [1] "S4" Les méthodes appartiennent toujours aux fonctions. Elles sont déclarées par la fonction setMethod(): setMethod("print", signature = "Personne", function(x, ...) { cat("La personne est:", x@Prenom, x@Nom) }) print(Moi) ## La personne est: Eric Marcon Les attributs sont appelés par la syntaxe variable@slot. En résumé, S4 est plus rigoureux que S3. Quelques packages sur CRAN : Matrix, sp, odbc… et beaucoup sur Bioconductor sont écrits en S4 mais le langage est maintenant clairement délaissé au profit de S3, notamment à cause du succès du tidyverse. 2.1.4 RC RC a été introduit dans R 2.12 (2010) avec le package methods. Les méthodes appartiennent aux classes, comme en C++: elles sont déclarées dans la classe et appelées à partir des objets. library("methods") # Déclaration de la classe PersonneRC <- setRefClass("PersonneRC", fields = list(Nom = "character", Prenom = "character"), methods = list(print = function() cat(Prenom, Nom))) # Constructeur MoiRC <- new("PersonneRC", Nom = "Marcon", Prenom ="Eric") # Langage pryr::otype(MoiRC) ## [1] "RC" # Appel de la méthode print MoiRC$print() ## Eric Marcon RC est un langage confidentiel, bien que ce soit le premier “vrai” langage orienté objet de R. 2.1.5 S6 S619 perfectionne RC mais n’est pas inclus dans R: il nécessite d’installer son package. Les attributs et les méthodes peuvent être publics ou privés. Une méthode initialize() est utilisée comme constructeur. library(R6) PersonneR6 <- R6Class("PersonneR6", public = list(Nom = "character", Prenom = "character", initialize = function(Nom = NA, Prenom = NA) { self$Nom <- Nom self$Prenom <- Prenom }, print = function() cat(self$Prenom, self$Nom))) MoiR6 <- PersonneR6$new(Nom = "Marcon", Prenom = "Eric") MoiR6$print() ## Eric Marcon S6 permet de programmer rigoureusement en objet mais est très peu utilisé. Les performances de S6 sont bien supérieures à celles de RC mais sont inférieures à celles de S320. La non-inclusion de R6 à R est montrée par pryr: pryr::otype(MoiR6) ## [1] "S3" 2.1.6 Tidyverse Le tidyverse est un ensemble de packages cohérents qui ont fait évoluer la façon de programmer R. L’ensemble des packages indispensables peut être chargé par le package tidyverse qui n’a pas d’autre utilité: library("tidyverse") Il ne s’agit pas d’un nouveau langage à proprement parler mais plutôt d’une extension de S3, avec de profondes modifications techniques, notamment l’évaluation non conventionnelle des expressions21, qu’il n’est pas essentiel de maîtriser en détail. Ses principes sont inscrits dans un manifeste22. Son apport le plus visible pour l’utilisateur sont l’enchaînement des commandes dans un flux (pipeline de code). En programmation standard, l’enchaînement des fonctions s’écrit par emboîtements successifs, ce qui en rend la lecture difficile, surtout quand des arguments sont nécessaires: # Logarithme de base 2 de la moyenne de 100 tirages # aléatoires dans une loi uniforme log(mean(runif(100)), base = 2) ## [1] -1.127903 Dans le tidyverse, les fonctions s’enchaînent, ce qui correspond souvent mieux à la réflexion du programmeur sur le traitement des données: # 100 tirages aléatoires dans une loi uniforme runif(100) %>% # Moyenne mean %>% # Logarithme log(base=2) ## [1] -0.9772102 Le tuyau %>% est un opérateur qui appelle la fonction suivante en lui passant comme premier argument le résultat de la fonction précédente. Les arguments supplémentaires sont passés normalement: pour la lisibilité du code, il est indispensable de les nommer. La plupart des fonctions de R sont utilisables sans difficultés dans le tidyverse bien qu’elles n’aient pas été prévues pour cela: il suffit que leur premier argument soit les données à traiter. Le pipeline ne permet de passer qu’une seule valeur à la fonction suivante, ce qui interdit les fonctions multidimensionnelles, de type f(x,y). La structure de données préférée est le tibble, qui est un dataframe amélioré: sa méthode print() est plus lisible, et il corrige quelques comportements non-intuitifs des dataframes, comme la conversion automatique en vecteurs des dataframes à une seule colonne. Les colonnes du dataframe ou du tibble permettent de passer autant de données que nécessaire. Enfin, la visualisation des données est prise en charge par ggplot2 qui s’appuie sur une grammaire des graphiques (Wickham 2010) solide sur le plan théorique. Schématiquement, un graphique est construit selon le modèle suivant: ggplot(data = <DATA>) + <GEOM_FUNCTION>( mapping = aes(<MAPPINGS>), stat = <STAT>, position = <POSITION> ) + <COORDINATE_FUNCTION> + <FACET_FUNCTION> les données sont obligatoirement un dataframe; la géométrie est le type de graphique choisi (points, lignes, histogrammes ou autre); l’esthétique (fonction aes()) désigne ce qui est représenté: c’est la correspondance entre les colonnes du dataframe et les éléments nécessaires à la géométrie; la statistique est le traitement appliqué aux données avant de les transmettre à la géométrie (souvent “identity”, c’est-à-dire aucune transformation mais “boxplot” pour une boîte à moustache). Les données peuvent être transformées par une fonction d’échelle, comme scale_y_log10(); la position est l’emplacement des objets sur le graphique (souvent “identity”; “stack” pour un histogramme empilé, “jitter” pour déplacer légèrement les points superposés dans un geom_point); les coordonnées définissent l’affichage du graphique (coord_fixed() pour ne pas déformer une carte par exemple) ; enfin, les facettes offrent la possibilité d’afficher plusieurs aspects des mêmes données en produisant un graphique par modalité d’une variable. L’ensemble formé par le pipeline et ggplot2 permet des traitements complexes dans un code lisible. La figure 2.1 montre le résultat du code suivant: # Données sur les diamants fournies par ggplot2 diamonds %>% # Ne conserver que les diamants de plus d'un demi-carat filter(carat > 0.5) %>% # Graphique : prix en fonction du poids ggplot(aes(x = carat, y = price)) + # Nuage de points geom_point() + # Echelle logarithmique scale_x_log10() + scale_y_log10() + # Régression linéaire geom_smooth(method = "lm") Figure 2.1: Prix des diamants en fonction de leur poids. Démonstration du code de ggplot2 combiné au traitement de données du tidyverse. Dans cette figure, deux géométries (nuage de points et régression linéaire) partagent la même esthétique (prix en fonction du poids en carats) qui est donc déclarée en amont, dans la fonction ggplot(). Le tidyverse est documenté en détail dans Wickham et Grolemund (2016) et ggplot2 dans Wickham (2017). 2.2 Environnements Les objets de R, données et fonctions, sont nommés. Comme R est modulaire, avec la possibilité de lui ajouter un nombre indéterminé de packages, il est très probable que des conflits de nom apparaissent. Pour les régler, R dispose d’un système rigoureux de précédence des noms: le code s’exécute dans un environnement défini, héritant d’environnements parents. 2.2.1 Organisation R démarre dans un environnement vide. Chaque package chargé crée un environnement fils pour former une pile des environnements, dont chaque nouvel élément est appelé “fils” du précédent, qui est son “parent”. La console se trouve dans l’environnement global, fils du dernier package chargé. search() ## [1] ".GlobalEnv" "package:R6" ## [3] "package:entropart" "package:forcats" ## [5] "package:stringr" "package:dplyr" ## [7] "package:purrr" "package:readr" ## [9] "package:tidyr" "package:tibble" ## [11] "package:ggplot2" "package:tidyverse" ## [13] "package:kableExtra" "package:stats" ## [15] "package:graphics" "package:grDevices" ## [17] "package:utils" "package:datasets" ## [19] "package:methods" "Autoloads" ## [21] "package:base" Le code d’une fonction appelée de la console s’exécute dans un environnement fils de l’environnement global: # Environnement actuel environment() ## <environment: R_GlobalEnv> # La fonction f affiche son environnement f <- function() environment() # Affichage de l'environnement de la fonction f() ## <environment: 0x7f9786fc6130> # Environnement parent de celui de la fonction parent.env(f()) ## <environment: R_GlobalEnv> 2.2.2 Recherche La recherche des objets commence dans l’environnement local. S’il n’est pas trouvé, il est cherché dans l’environnement parent, puis dans le parent du parent, jusqu’à l’épuisement des environnements qui génère une erreur indiquant que l’objet n’a pas été trouvé. Exemple: # Variable q définie dans l'environnement global q <- "GlobalEnv" # Fonction définissant q dans son environnement qLocalFonction <- function() { q <- "Fonction" return(q) } # La variable locale est retournée qLocalFonction() ## [1] "Fonction" # Fonction (mal écrite) utilisant une variable qu'elle ne # définit pas qGlobalEnv <- function() { return(q) } # La variable de l'environnement global est retournée qGlobalEnv() ## [1] "GlobalEnv" # Suppression de cette variable rm(q) # La fonction base::q est retournée qGlobalEnv() ## function (save = "default", status = 0, runLast = TRUE) ## .Internal(quit(save, status, runLast)) ## <bytecode: 0x7f976e1ae5c0> ## <environment: namespace:base> La variable q est définie dans l’environnement global. La fonction qLocalFonction définit sa propre variable q. L’appel de la fonction retourne la valeur locale de la fonction parce qu’elle se trouve dans l’environnement de la fonction. La fonction qGlobalEnv retourne la variable q qu’elle ne définit pas localement. Elle la recherche donc dans son environnement parent et trouve la variable définie dans l’environnement global. En supprimant la variable de l’environnement global par rm(q), la fonction qGlobalEnv() parcourt la pile des environnements jusqu’à trouver un objet nommé q dans le package base, qui est la fonction permettant de quitter R. Elle aurait pu trouver un autre objet si un package contenant un objet q avait été chargé. Pour éviter ce comportement erratique, une fonction ne doit jamais appeler un objet non défini dans son propre environnement. 2.2.3 Espaces de nom des packages Il est temps de définir précisément ce que les packages rendent visible. Les packages contiennent des objets (fonctions et données) qu’ils exportent ou non. Ils sont habituellement appelés par la fonction library() qui effectue deux opérations: elle charge le package en mémoire, ce qui permet d’accéder à tous ses objets avec la syntaxe package::objet pour les objets exportés et package:::objet pour ceux qui ne le sont pas; elle attache ensuite le package, ce qui place son environnement en haut de la pile. Il est possible de détacher un package avec la fonction unloadNamespace() pour le retirer de la pile des environnements. Exemple: # entropart chargé et attaché library("entropart") # Est-il attaché ? isNamespaceLoaded("entropart") ## [1] TRUE # Pile des environnements search() ## [1] ".GlobalEnv" "package:R6" ## [3] "package:entropart" "package:forcats" ## [5] "package:stringr" "package:dplyr" ## [7] "package:purrr" "package:readr" ## [9] "package:tidyr" "package:tibble" ## [11] "package:ggplot2" "package:tidyverse" ## [13] "package:kableExtra" "package:stats" ## [15] "package:graphics" "package:grDevices" ## [17] "package:utils" "package:datasets" ## [19] "package:methods" "Autoloads" ## [21] "package:base" # Diversity(), une fonction exportée par entropart est # trouvée Diversity(1, CheckArguments = FALSE) ## None ## 1 # Détacher et décharger entropart unloadNamespace("entropart") # Est-il attaché ? isNamespaceLoaded("entropart") ## [1] FALSE # Pile des environnements, sans entropart search() ## [1] ".GlobalEnv" "package:R6" ## [3] "package:forcats" "package:stringr" ## [5] "package:dplyr" "package:purrr" ## [7] "package:readr" "package:tidyr" ## [9] "package:tibble" "package:ggplot2" ## [11] "package:tidyverse" "package:kableExtra" ## [13] "package:stats" "package:graphics" ## [15] "package:grDevices" "package:utils" ## [17] "package:datasets" "package:methods" ## [19] "Autoloads" "package:base" # Diversity() est introuvable tryCatch(Diversity(1), error = function(e) print(e)) ## <simpleError in Diversity(1): could not find function "Diversity"> # mais peut être appelée avec son nom complet entropart::Diversity(1, CheckArguments = FALSE) ## None ## 1 L’appel de entropart::Diversity() charge le package (c’est-à-dire, exécute implicitement loadNamespace(\"entropart\")) mais ne l’attache pas. En pratique, il faut limiter le nombre de package attachés pour limiter le risque d’appeler une fonction non désirée, homonyme de la fonction recherchée. Dans les cas critiques, il faut utiliser le nom complet de la fonction: package::fonction(). Un problème fréquent concerne la filter() de dplyr homonyme de celle de stats. Le package stats est habituellement chargé avant dplyr, un package du tidyverse. stats::filter() doit donc être appelée explicitement. Cependant, le package dplyr ou tidyverse (qui attache tous les packages du tidyverse) peut être chargé systématiquement en créant un fichier .RProfile à la racine du projet contenant la commande: library("tidyverse") Dans ce cas, dplyr est chargé avant stats et c’est sa fonction qui est inaccessible. 2.3 Mesure du temps d’exécution Le temps d’exécution d’un code long peut être mesuré très simplement par la commande system.time. Pour des temps d’exécution très courts, il est nécessaire de répéter la mesure: c’est l’objet du package microbenchmark. 2.3.1 system.time La fonction retourne le temps d’exécution du code. # Ecart absolu moyen de 1000 valeurs dans une loi uniforme, # répété 100 fois system.time(for (i in 1:100) mad(runif(1000))) ## user system elapsed ## 0.019 0.000 0.019 2.3.2 microbenchmark Le package microbenchmark est le plus avancé. L’objectif est de comparer la vitesse du calcul du carré d’un vecteur (ou d’un nombre) en le multipliant par lui-même (\\(x \\times x\\)) ou en l’élevant à la puissance 2 (\\(x^2\\)). # Fonctions à tester f1 <- function(x) x * x f2 <- function(x) x^2 f3 <- function(x) x^2.1 f4 <- function(x) x^3 # Initialisation X <- rnorm(10000) # Test library("microbenchmark") (mb <- microbenchmark(f1(X), f2(X), f3(X), f4(X))) ## Unit: microseconds ## expr min lq mean median uq ## f1(X) 37.142 39.1465 54.65247 40.3720 42.4070 ## f2(X) 44.877 46.9740 63.05465 48.4895 50.2870 ## f3(X) 271.351 279.0300 301.52159 287.6280 296.1190 ## f4(X) 407.105 410.6215 435.97279 424.8845 427.8935 ## max neval ## 1318.279 100 ## 1358.744 100 ## 1653.345 100 ## 1804.322 100 Le tableau retourné contient les temps minimum, médian, moyen, max et les premiers et troisièmes quartiles, ainsi que le nombre de répétitions. La valeur médiane est à comparer. Le nombre de répétition est par défaut de 100, à moduler (argument times) en fonction de la complexité du calcul. Le résultat du test, un objet de type microbenchmark, est un tableau brut des temps d’exécution. L’analyse statistique est faite par les méthodes print et summary. Pour choisir les colonnes à afficher, utiliser la syntaxe suivante: summary(mb)[, c("expr", "median")] ## expr median ## 1 f1(X) 40.3720 ## 2 f2(X) 48.4895 ## 3 f3(X) 287.6280 ## 4 f4(X) 424.8845 Pour faire des calculs sur ces résultats, il faut les stocker dans une variable. Pour empêcher l’affichage dans la console, la solution la plus simple est d’utiliser la fonction capture.output en affectant son résultat à une variable. dummy <- capture.output(mbs <- summary(mb)) Le test précédent est affiché à nouveau. summary(mb)[, c("expr", "median")] ## expr median ## 1 f1(X) 40.3720 ## 2 f2(X) 48.4895 ## 3 f3(X) 287.6280 ## 4 f4(X) 424.8845 Le temps de calcul est à peu près identique entre \\(x \\times x\\) et \\(x^2\\). Le calcul de puissance est nettement plus long, surtout si la puissance n’est pas entière, parce qu’il nécessite un calcul de logarithme. Le calcul de la puissance 2 est donc optimisé par R pour éviter l’usage du log. Deux représentations graphiques sont disponibles: les violons représentent la densité de probabilité du temps d’exécution; les boîtes à moustache sont classiques. library("ggplot2") autoplot(mb) boxplot(mb) 2.3.3 Profilage profvis est l’outil de profilage de RStudio. Il permet de suivre le temps d’exécution de chaque ligne de code et la mémoire utilisée. L’objectif est de détecter les portions de code lentes, à améliorer. library(profvis) p <- profvis({ # Calculs de cosinus cos(runif(10^7)) # 1/2 seconde de pause pause(1/2) }) htmlwidgets::saveWidget(p, "docs/profile.html") Le résultat est un fichier HTML contenant le rapport de profilage23. On peut observer que le temps de tirage des nombres aléatoires est similaire à celui du calcul des cosinus. Lire la documentation complète24 sur le site de RStudio. 2.4 Boucles Le cas le plus fréquent de code long à exécuter est celui des boucles: le même code est répété un grand nombre de fois. 2.4.1 Fonctions vectorielles La plupart des fonctions de R sont vectorielles: les boucles sont traitées de façon interne, extrêmement rapide. Il faut donc raisonner en termes de vecteurs plutôt que de scalaires. # Tirage de deux vecteurs de trois nombres aléatoires entre # 0 et 1 x1 <- runif(3) x2 <- runif(3) # Racine carrée des trois nombres de x1 sqrt(x1) ## [1] 0.9427738 0.8665204 0.4586981 # Sommes respective des trois nombres de x1 et x2 x1 + x2 ## [1] 1.6262539 1.6881583 0.9063973 Il faut aussi écrire des fonctions vectorielles sur leur premier argument. La fonction lnq du package entropart retourne le logarithme déformé d’ordre \\(q\\) d’un nombre \\(x\\). # Code de la fonction entropart::lnq ## function (x, q) ## { ## if (q == 1) { ## return(log(x)) ## } ## else { ## Log <- (x^(1 - q) - 1)/(1 - q) ## Log[x < 0] <- NA ## return(Log) ## } ## } ## <bytecode: 0x7f976e8dc668> ## <environment: namespace:entropart> Pour qu’une fonction soit vectorielle, chaque ligne de son code doit permettre que le premier argument soit traité comme un vecteur. Ici: log(x) et x^ sont une fonction et un opérateur vectoriels et la condition [x < 0] retourne aussi un vecteur. 2.4.2 lapply Les codes qui ne peuvent pas être écrits comme une fonction vectorielle nécessitent des boucles. lapply() applique une fonction à chaque élément d’une liste. Elle est déclinée sous plusieurs versions: lapply() renvoie une liste (économise le temps de leur réorganisation dans un tableau); sapply() renvoie un dataframe en rassemblant les listes par simplify2array(); vapply() est presque identique mais demande que le type de données du résultat soit fourni. # Tirage de 1000 valeurs dans une loi uniforme x1 <- runif(1000) # La racine carrée peut être calculée pour le vecteur ou # chaque valeur identical(sqrt(x1), sapply(x1, FUN = sqrt)) ## [1] TRUE mb <- microbenchmark(sqrt(x1), lapply(x1, FUN = sqrt), sapply(x1, FUN = sqrt), vapply(x1, FUN = sqrt, FUN.VALUE = 0)) summary(mb)[, c("expr", "median")] ## expr median ## 1 sqrt(x1) 4.5465 ## 2 lapply(x1, FUN = sqrt) 301.3905 ## 3 sapply(x1, FUN = sqrt) 355.6575 ## 4 vapply(x1, FUN = sqrt, FUN.VALUE = 0) 306.9455 lapply() est beaucoup plus lent qu’une fonction vectorielle. sapply() nécessite plus de temps pour simplify2array(), qui doit détecter comment rassembler les résultats. Enfin, vapply() économise le temps de détermination du type de données du résultat et permet d’accélérer le calcul avec peu d’efforts. 2.4.3 Boucles for Les boucles sont gérées par la fonction for. Elles ont la réputation d’être lentes dans R parce que le code à l’intérieur de la boucle doit être interprété à chaque exécution. Ce n’est plus le cas depuis la version 3.5 de R: les boucles sont compilées systématiquement avant leur exécution. Le comportement du compilateur “juste à temps” est défini par la fonction enableJIT. Le niveau par défaut est 3: les fonctions sont toutes compilées, et les boucles dans le code aussi. Pour évaluer le gain de performance, le code suivant supprime toute compilation automatique, et compare la même boucle compilée ou non. library("compiler") # Pas de compilation automatique enableJIT(level = 0) ## [1] 3 # Boucle pour calculer la racine carrée d'un vecteur Boucle <- function(x) { # Initialisation du vecteur de résultat, indispensable Racine <- vector("numeric", length = length(x)) # Boucle for (i in 1:length(x)) Racine[i] <- sqrt(x[i]) return(Racine) } # Version compilée Boucle2 <- cmpfun(Boucle) # Comparaison mb <- microbenchmark(Boucle(x1), Boucle2(x1)) (mbs <- summary(mb)[, c("expr", "median")]) ## expr median ## 1 Boucle(x1) 811.290 ## 2 Boucle2(x1) 78.453 # Compilation automatique par défaut depuis la version 3.5 enableJIT(level = 3) ## [1] 0 Le gain est considérable: de 1 à 10. Les boucles for sont maintenant nettement plus rapides que vapply. # Test mb <- microbenchmark(vapply(x1, FUN = sqrt, 0), Boucle(x1)) summary(mb)[, c("expr", "median")] ## expr median ## 1 vapply(x1, FUN = sqrt, 0) 304.2405 ## 2 Boucle(x1) 76.0030 Attention, le test de performance peut être trompeur: # Préparation du vecteur de résultat Racine <- vector("numeric", length = length(x1)) # Test mb <- microbenchmark(vapply(x1, FUN = sqrt, 0), for(i in 1:length(x1)) Racine[i] <- sqrt(x1[i])) summary(mb)[, c("expr", "median")] ## expr median ## 1 vapply(x1, FUN = sqrt, 0) 322.325 ## 2 for (i in 1:length(x1)) Racine[i] <- sqrt(x1[i]) 3318.099 Dans ce code, la boucle for n’est pas compilée donc elle est beaucoup plus lente que dans le cadre normal de son utilisation (dans une fonction ou au niveau supérieur du code). Les boucles longues permettent un suivi de leur progression par une barre de texte, ce qui est un autre avantage. La fonction suivante exécute des pauses d’un dixième de seconde pendant le temps passé en paramètre (en secondes). BoucleSuivie <- function(duree = 1) { # Barre de progression pgb <- txtProgressBar(min = 0, max = duree * 10) # Boucle for (i in 1:(duree * 10)) { # Pause d'un dixième de seconde Sys.sleep(1/10) # Suivi de la progression setTxtProgressBar(pgb, i) } } BoucleSuivie() ## ============================================================ 2.4.4 replicate replicate() répète une instruction. replicate(3, runif(1)) ## [1] 0.9453453 0.5262818 0.7233425 Ce code est équivalent à runif(3), avec des performances similaires à celles de vapply: de 50 à 100 fois plus lent qu’une fonction vectorielle. mb <- microbenchmark(replicate(1000, runif(1)), runif(1000)) summary(mb)[, c("expr", "median")] ## expr median ## 1 replicate(1000, runif(1)) 4054.9280 ## 2 runif(1000) 34.5745 2.4.5 Vectorize Vectorize() rend vectorielle une fonction qui ne l’est pas, par des boucles. Ecrire plutôt les boucles. 2.4.6 Statistiques marginales apply applique une fonction aux lignes ou colonnes d’un objet en deux dimensions. colSums et ses semblables (rowSums, colMeans, rowMeans) sont optimisées. # Somme des colonnes numériques du jeu de données diamonds de ggplot() # Boucle identique à l'action de apply(, 2, ) BoucleSomme <- function(Table) { Somme <- vector("numeric", length = ncol(Table)) for (i in 1:ncol(Table)) Somme[i] <- sum(Table[, i]) return(Somme) } mb <- microbenchmark(BoucleSomme(diamonds[-(2:4)]), apply(diamonds[-(2:4)], 2, sum), colSums(diamonds[-(2:4)])) summary(mb)[, c("expr", "median")] ## expr median ## 1 BoucleSomme(diamonds[-(2:4)]) 3.635007 ## 2 apply(diamonds[-(2:4)], 2, sum) 9.343476 ## 3 colSums(diamonds[-(2:4)]) 2.421996 apply clarifie le code mais est plus lent que la boucle, qui est à peine plus lente que colSums. 2.5 Code C++ L’intégration de code C++ dans R est largement simplifiée par le package Rcpp mais reste difficile à déboguer et donc à réserver à du code très simple (pour éviter toute erreur) et répété un grand nombre de fois (pour mériter l’effort). La préparation des données et leur vérification doivent être exécutées sous R, de même que le traitement et la présentation des résultats. L’utilisation habituelle est l’inclusion de code C++ dans un package, mais l’utilisation hors package est possible: Le code C++ peut être inclus dans un document C++ (fichier avec l’extension .cpp): il est compilé par la commande sourceCpp() qui crée les fonctions R permettant d’appeler le code C++. Dans un document RMarkdown, des bouts de code Rcpp peuvent être créés pour y insérer le code C++: ils sont compilés et interfacés pour R au moment du tricotage. L’exemple suivant montre comment créer une fonction C++ pour calculer le double d’un vecteur numérique. #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] NumericVector timesTwo(NumericVector x) { return x * 2; } Une fonction R du même nom que la fonction C++ est maintenant disponible. timesTwo(1:5) ## [1] 2 4 6 8 10 Les performances sont deux ordres de grandeur plus rapides que le code R (voir l’étude de cas, section 2.7). 2.6 Paralléliser R Lorsque des calculs longs peuvent être découpés en tâches indépendantes, l’exécution simultanée (parallèle) de ces tâches permet de réduire le temps de calcul total à celui de la tâche la plus longue, auquel s’ajoute le coût de la mise en place de la parallélisation (création des tâches, récupération des résultats…). Lire l’excellente introduction de Josh Errickson25 qui détaille les enjeux et les contraintes de la parallélisation. Deux mécanismes sont disponibles pour l’exécution de code en parallèle: fork: le processus en cours d’exécution est dupliqué sur plusieurs cœurs du processeur de l’ordinateur de calcul. C’est la méthode la plus simple mais elle ne fonctionne pas sous Windows (limite du système d’exploitation). socket: un cluster est constitué, soit physiquement (un ensemble d’ordinateurs exécutant R est nécessaire) soit logiquement (une instance de R sur chaque cœur de l’ordinateur utilisé). Les membres du cluster communiquent par le réseau (le réseau interne de l’ordinateur utilisé pour un cluster logique). Différents packages de R permettent de mettre en œuvre ces mécanismes. 2.6.1 mclapply (fork) La fonction mclapply du package parallel a la même syntaxe que lapply mais parallélise l’exécution des boucles. Sous Windows, elle n’a aucun effet puisque le système ne permet pas les fork: elle appelle simplement lapply. Cependant, un contournement existe pour émuler mclapply sous Windows en appelant parLapply, qui utilise un cluster. ## ## mclapply.hack.R ## ## Nathan VanHoudnos ## nathanvan AT northwestern FULL STOP edu ## July 14, 2014 ## ## A script to implement a hackish version of ## parallel:mclapply() on Windows machines. ## On Linux or Mac, the script has no effect ## beyond loading the parallel library. require(parallel) ## Loading required package: parallel ## Define the hack # mc.cores argument added: Eric Marcon mclapply.hack <- function(..., mc.cores=detectCores()) { ## Create a cluster size.of.list <- length(list(...)[[1]]) cl <- makeCluster( min(size.of.list, mc.cores) ) ## Find out the names of the loaded packages loaded.package.names <- c( ## Base packages sessionInfo()$basePkgs, ## Additional packages names( sessionInfo()$otherPkgs )) tryCatch( { ## Copy over all of the objects within scope to ## all clusters. this.env <- environment() while( identical( this.env, globalenv() ) == FALSE ) { clusterExport(cl, ls(all.names=TRUE, env=this.env), envir=this.env) this.env <- parent.env(environment()) } clusterExport(cl, ls(all.names=TRUE, env=globalenv()), envir=globalenv()) ## Load the libraries on all the clusters ## N.B. length(cl) returns the number of clusters parLapply( cl, 1:length(cl), function(xx){ lapply(loaded.package.names, function(yy) { require(yy , character.only=TRUE)}) }) ## Run the lapply in parallel return( parLapply( cl, ...) ) }, finally = { ## Stop the cluster stopCluster(cl) }) } ## Warn the user if they are using Windows if( Sys.info()[['sysname']] == 'Windows' ){ message(paste( "\\n", " *** Microsoft Windows detected ***\\n", " \\n", " For technical reasons, the MS Windows version of mclapply()\\n", " is implemented as a serial function instead of a parallel\\n", " function.", " \\n\\n", " As a quick hack, we replace this serial version of mclapply()\\n", " with a wrapper to parLapply() for this R session. Please see\\n\\n", " http://www.stat.cmu.edu/~nmv/2014/07/14/ implementing-mclapply-on-windows \\n\\n", " for details.\\n\\n")) } ## If the OS is Windows, set mclapply to the ## the hackish version. Otherwise, leave the ## definition alone. mclapply <- switch( Sys.info()[['sysname']], Windows = {mclapply.hack}, Linux = {mclapply}, Darwin = {mclapply}) ## end mclapply.hack.R Le code suivant teste la parallélisation d’une fonction qui renvoie son argument inchangé après une pause d’un quart de seconde. Ce document est tricoté avec 3 cœurs, qui sont tous utilisés sauf un pour ne pas saturer le système. f <- function(x, time = 0.25) { Sys.sleep(time) return(x) } # Laisser un coeur libre pour le système nbCoeurs <- detectCores() - 1 # Série : temps théorique = nbCoeurs/4 secondes (tserie <- system.time(lapply(1:nbCoeurs, f))) ## user system elapsed ## 0.002 0.000 0.538 # Parallèle : temps théorique = 1/4 seconde (tparallele <- system.time(mclapply(1:nbCoeurs, f, mc.cores = nbCoeurs))) ## user system elapsed ## 0.002 0.005 0.280 La mise en place de la parallélisation a un coût d’environ 0.03 secondes ici. Le temps d’exécution est bien plus long en parallèle sous Windows parce que la mise en place du cluster prend bien plus de temps que la parallélisation n’en fait gagner. La parallélisation est intéressante pour des tâches plus longues, comme une pause d’un seconde. # Série system.time(lapply(1:nbCoeurs, f, time = 1)) ## user system elapsed ## 0.000 0.000 2.012 # Parallèle system.time(mclapply(1:nbCoeurs, f, time = 1, mc.cores = nbCoeurs)) ## user system elapsed ## 0.001 0.003 1.091 Le temps additionnel nécessaire pour l’exécution parallèle du nouveau code est relativement plus faible: les coûts deviennent inférieurs à l’économie quand le temps de chaque tâche s’allonge. Si le nombre de tâches parallèles dépasse le nombre de cœurs utilisés, les performances s’effondrent parce que la tâche supplémentaire doit être exécutée après les premières. system.time(mclapply(1:nbCoeurs, f, time = 1, mc.cores = nbCoeurs)) ## user system elapsed ## 0.002 0.008 1.070 system.time(mclapply(1:(nbCoeurs + 1), f, time = 1, mc.cores = nbCoeurs)) ## user system elapsed ## 0.004 0.005 2.089 Le temps reste ensuite stable jusqu’au double du nombre de cœurs. La figure 2.2 montre l’évolution du temps de calcul en fonction du nombre de tâches. Taches <- 1:(2 * nbCoeurs+1) Temps <- sapply(Taches, function(nbTaches) { system.time(mclapply(1:nbTaches, f, time=1, mc.cores=nbCoeurs)) }) library("tidyverse") tibble(Taches, Temps=Temps["elapsed", ]) %>% ggplot + geom_line(aes(x = Taches, y = Temps)) + geom_vline(xintercept = nbCoeurs, col = "red", lty = 2) + geom_vline(xintercept = 2 * nbCoeurs, col = "red", lty = 2) Figure 2.2: Temps d’exécution en parallèle de tâches nécessitant une seconde (chaque tâche est une pause d’une seconde). Le nombre de tâches varie de 1 à deux fois le nombre de cœurs utilisés (égal à 2) plus une. La forme théorique de cette courbe est la suivante: pour une tâche, le temps est égal à une seconde plus le temps de mise en place de la parallélisation; le temps devrait rester stable jusqu’au nombre de cœurs utilisés; quand les cœurs sont tous utilisés (pointillés rouges), le temps devrait augmenter d’une seconde puis rester stable jusqu’à la limite suivante. En pratique, le temps de calcul est déterminé par d’autres facteurs difficilement prévisibles. La bonne pratique est d’adapter le nombre de tâches au nombre de cœurs sous peine de perte de performance. 2.6.2 parLapply (socket) parLapply nécessite de créer un cluster, exporter les variables utiles sur chaque noeud, charger les packages nécessaires sur chaque noeud, exécuter le code et enfin arrêter le cluster. Le code de chaque étape se trouve dans la fonction mclapply.hack ci-dessus. Pour un usage courant, mclapply est plus rapide, sauf sous Windows, et plus simple (y compris sous Windows grâce au contournement ci-dessus.) 2.6.3 foreach 2.6.3.1 Fonctionnement Le package foreach permet un usage avancé de la parallélisation. Lire ses vignettes. # Manuel vignette("foreach", "foreach") # Boucles imbriquées vignette("nested", "foreach") Indépendamment de la parallélisation, foreach redéfinit les boucles for. for (i in 1:3) { f(i) } # devient library("foreach") ## ## Attaching package: 'foreach' ## The following objects are masked from 'package:purrr': ## ## accumulate, when foreach(i = 1:3) %do% { f(i) } ## [[1]] ## [1] 1 ## ## [[2]] ## [1] 2 ## ## [[3]] ## [1] 3 La fonction foreach retourne une liste contenant les résultats de chaque boucle. Les éléments de la liste peuvent être combinés par une fonction quelconque, comme c. foreach(i = 1:3, .combine = "c") %do% { f(i) } ## [1] 1 2 3 La fonction foreach est capable d’utiliser des itérateurs, c’est-à-dire des fonctions qui ne passent à la boucle que les données dont elle a besoin sans charger les autres en mémoire. Ici, l’itérateur icount passe les valeurs 1, 2 et 3 individuellement, sans charger le vecteur 1:3 en mémoire. library("iterators") foreach(i = icount(3), .combine = "c") %do% { f(i) } ## [1] 1 2 3 Elle est donc très utile quand chaque objet de la boucle utilise une grande quantité de mémoire. 2.6.3.2 Parallélisation Remplacer l’opérateur %do% par %dopar% parallélise les boucles, à condition qu’un adaptateur, c’est-à-dire un package intermédiaire entre foreach et un package chargé de l’implémentation de la parallélisation, soit chargé. doParallel est un adaptateur pour utiliser le package parallel livré avec R. library(doParallel) registerDoParallel(cores = nbCoeurs) # Série system.time(foreach(i = icount(nbCoeurs), .combine = "c") %do% { f(i) }) ## user system elapsed ## 0.003 0.000 0.542 # Parallèle system.time(foreach(i = icount(nbCoeurs), .combine = "c") %dopar% { f(i) }) ## user system elapsed ## 0.008 0.012 0.271 Le coût fixe de la parallélisation est faible. 2.7 Etude de cas Cette étude de cas permet de tester les différentes techniques vues plus haut pour résoudre un problème concret. L’objectif est de calculer la distance moyenne entre deux points d’un semis aléatoire de 1000 points dans une fenêtre carrée de côté 1. Son espérance est calculable26. Elle est égale à \\(\\frac{2+\\sqrt{2}+5\\ln{(1+\\sqrt{2})}}{15} \\approx 0,5214\\). 2.7.1 Création des données Le semis de points est créé avec le package spatstat. NbPoints <- 1000 library("spatstat") X <- runifpoint(NbPoints) 2.7.2 Spatstat La fonction pairdist() de spatstat retourne la matrice des distances entre les points. La distance moyenne est calculée en divisant la somme par le nombre de paires de points distincts. mb <- microbenchmark(d <- sum(pairdist(X))/NbPoints/(NbPoints - 1)) # suppressmessages pour éliminer les messages superflus suppressMessages(autoplot(mb)) d ## [1] 0.5154062 La fonction est rapide parce qu’elle est codée en langage C dans le package spatstat pour le cœur de ses calculs. 2.7.3 apply La distance peut être calculée par deux sapply() imbriqués. fsapply1 <- function() { distances <- sapply(1:NbPoints, function(i) sapply(1:NbPoints, function(j) sqrt((X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2))) return(sum(distances)/NbPoints/(NbPoints - 1)) } system.time(d <- fsapply1()) ## user system elapsed ## 5.574 0.052 5.887 d ## [1] 0.5154062 Un peu de temps peut être gagnée en remplaçant sapply par vapply: le format des résultats n’a pas à être déterminé par la fonction. Le gain est négligeable sur un long calcul comme celui-ci mais important pour des calculs courts. fsapply2 <- function() { distances <- vapply(1:NbPoints, function(i) vapply(1:NbPoints, function(j) sqrt((X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2), 0), 1:1000 + 0) return(sum(distances)/NbPoints/(NbPoints - 1)) } system.time(d <- fsapply2()) ## user system elapsed ## 5.529 0.042 5.977 d ## [1] 0.5154062 Le format de sortie n’est pas toujours évident à écrire: il doit respecter la taille des données: un vecteur de taille 1000 pour la boucle externe, un scalaire pour la boucle interne. il doit respecter leur type: 0 pour un entier, 0.0 pour un réel. Dans la boucle externe, l’ajout de 0.0 au vecteur d’entiers le transforme en vecteur de réels. Une amélioration plus significative consiste à ne calculer les racines carrées qu’à la fin de la boucle, pour profiter de la vectorisation de la fonction. fsapply3 <- function() { distances <- vapply(1:NbPoints, function(i) vapply(1:NbPoints, function(j) (X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2, 0), 1:1000 + 0) return(sum(sqrt(distances))/NbPoints/(NbPoints - 1)) } system.time(d <- fsapply3()) ## user system elapsed ## 5.266 0.031 5.579 d ## [1] 0.5154062 Les calculs sont effectués deux fois (distance entre les points \\(i\\) et \\(j\\), mais aussi entre les points \\(j\\) et \\(i\\)): un test sur les indices permet de diviser presque le temps par 2 (pas tout à fait parce que les boucles sans calcul, qui retournent \\(0\\), prennent du temps). fsapply4 <- function() { distances <- vapply(1:NbPoints, function(i) { vapply(1:NbPoints, function(j) { if (j > i) { (X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2 } else { 0 } }, 0) }, 1:1000 + 0) return(sum(sqrt(distances))/NbPoints/(NbPoints - 1) * 2) } system.time(d <- fsapply4()) ## user system elapsed ## 3.070 0.020 3.245 d ## [1] 0.5154062 En parallèle, le temps de calcul n’est pas amélioré sous Windows parce que les tâches individuelles sont trop courtes. Sous MacOS ou Linux, le calcul est accéléré. fsapply5 <- function() { distances <- mclapply(1:NbPoints, function(i) { vapply(1:NbPoints, function(j) { if (j > i) { (X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2 } else { 0 } }, 0) }) return(sum(sqrt(simplify2array(distances)))/NbPoints/(NbPoints - 1) * 2) } system.time(d <- fsapply5()) ## user system elapsed ## 3.361 0.310 1.991 d ## [1] 0.5154062 2.7.4 boucle for Une boucle for est plus rapide et consomme moins de mémoire parce qu’elle ne stocke pas la matrice de distances. distance <- 0 ffor <- function() { for (i in 1:(NbPoints - 1)) { for (j in (i + 1):NbPoints) { distance <- distance + sqrt((X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2) } } return(distance/NbPoints/(NbPoints - 1) * 2) } # Temps de calcul, mémorisé (for_time <- system.time(d <- ffor())) ## user system elapsed ## 1.839 0.013 1.968 d ## [1] 0.5154062 C’est la façon la plus simple et efficace d’écrire ce code sans parallélisation et en se limitant au langage de R. 2.7.5 boucle foreach Deux boucles foreach imbriquées sont nécessaires ici: elles sont extrêmement lentes en comparaison d’une boucle simple. Le test est lancé ici avec 10 fois moins de points, donc 100 fois moins de distances à calculer. NbPointsReduit <- 100 Y <- runifpoint(NbPointsReduit) fforeach1 <- function(Y) { distances <- foreach(i = 1:NbPointsReduit, .combine = "cbind") %:% foreach(j = 1:NbPointsReduit, .combine = "c") %do% { if (j > i) { (Y$x[i] - Y$x[j])^2 + (Y$y[i] - Y$y[j])^2 } else { 0 } } return(sum(sqrt(distances))/NbPointsReduit/(NbPointsReduit - 1) * 2) } system.time(d <- fforeach1(Y)) ## user system elapsed ## 2.606 0.023 2.733 d ## [1] 0.5181951 Les boucles foreach imbriquées sont à réserver à des tâches très longues (plusieurs secondes au moins) pour amortir les coûts fixes de leur mise en place. La parallélisation est efficace dans le code ci-dessous, notamment parce qu’elle permet d’éviter les boucles foreach imbriquées. En revanche, les distances sont calculées deux fois. La performance reste très inférieure à celle d’une simple boucle for (rappel: 100 fois moins de distances sont calculées). registerDoParallel(cores = detectCores()) fforeach3 <- function(Y) { distances <- foreach(i=icount(NbPointsReduit), .combine='+') %dopar% { distance <- 0 for (j in 1:Y$n) { distance <- distance + sqrt((Y$x[i]-Y$x[j])^2 + (Y$y[i]-Y$y[j])^2) } distance } return(distances/NbPointsReduit/(NbPointsReduit-1)) } system.time(d <- fforeach3(Y)) ## user system elapsed ## 0.115 0.038 0.095 d ## [1] 0.5181951 foreach dispose d’adaptateurs optimisés permettant d’utiliser des clusters physiques par exemple. Son intérêt est limité avec le package parallel. 2.7.6 RCpp La fonction C++ permettant de calculer les distances est la suivante. #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] double MeanDistance(NumericVector x, NumericVector y) { double distance=0; double dx, dy; for (int i=0; i < (x.length()-1); i++) { for (int j=i+1; j < x.length(); j++) { // Calculate distance dx = x[i]-x[j]; dy = y[i]-y[j]; distance += sqrt(dx*dx + dy*dy); } } return distance/(double)(x.length()/2*(x.length()-1)); } Elle est appelée dans R très simplement. Le temps d’exécution est très court. mb <- microbenchmark(d <- MeanDistance(X$x, X$y)) # suppressmessages pour éliminer les messages superflus suppressMessages(autoplot(mb)) d ## [1] 0.5154062 2.7.7 RcppParallel RcppParallel permet d’interfacer du code C++ parallélisé, au prix d’une syntaxe plus complexe qu’avec RCpp. Une documentation est disponible27. La fonction C++ exportée dans R ne réalise pas les calculs mais organise seulement l’exécution en parallèle d’une autre fonction, non exportée, de type Worker. Deux fonctions (C++) de parallélisation sont disponibles pour deux types de tâches: parallelReduce pour l’accumulation d’une valeur, utilisée ici pour additionner les distances. parallelFor pour remplir une matrice de résultats. La syntaxe du Worker est un peu laborieuse mais assez simple à adapter: les constructeurs initialisent les variables C à partir des valeurs transmises par R et déclarent la parallélisation. // [[Rcpp::depends(RcppParallel)]] #include <Rcpp.h> #include <RcppParallel.h> using namespace Rcpp; using namespace RcppParallel; // Fonction de travail, non exportée struct TotalDistanceWrkr : public Worker { // source vectors const RVector<double> Rx; const RVector<double> Ry; // accumulated value double distance; // constructors TotalDistanceWrkr(const NumericVector x, const NumericVector y) : Rx(x), Ry(y), distance(0) {} TotalDistanceWrkr(const TotalDistanceWrkr& totalDistanceWrkr, Split) : Rx(totalDistanceWrkr.Rx), Ry(totalDistanceWrkr.Ry), distance(0) {} // count neighbors void operator()(std::size_t begin, std::size_t end) { double dx, dy; unsigned int Npoints = Rx.length(); for (unsigned int i = begin; i < end; i++) { for (unsigned int j=i+1; j < Npoints; j++) { // Calculate squared distance dx = Rx[i]-Rx[j]; dy = Ry[i]-Ry[j]; distance += sqrt(dx*dx + dy*dy); } } } // join my value with that of another Sum void join(const TotalDistanceWrkr& rhs) { distance += rhs.distance; } }; // Fonction exportée // [[Rcpp::export]] double TotalDistance(NumericVector x, NumericVector y) { // Declare TotalDistanceWrkr instance TotalDistanceWrkr totalDistanceWrkr(x, y); // call parallel_reduce to start the work parallelReduce(0, x.length(), totalDistanceWrkr); // return the result return totalDistanceWrkr.distance; } L’usage dans R est identique à celui des fonctions C++ interfacées par RCpp. (mb <- microbenchmark(d <- TotalDistance(X$x, X$y)/NbPoints/(NbPoints - 1) * 2)) ## Unit: microseconds ## expr ## d <- TotalDistance(X$x, X$y)/NbPoints/(NbPoints - 1) * 2 ## min lq mean median uq max neval ## 770.821 774.055 855.9053 775.8975 778.887 2661.189 100 # suppressmessages pour éliminer les messages superflus suppressMessages(autoplot(mb)) d ## [1] 0.5154062 Le temps de mise en place des tâches parallèles est bien plus long que le temps de calcul en série. En multipliant le nombre de points par 50, le temps de calcul en série doit être multiplié par 2500 environ. NbPoints <- 50000 X <- runifpoint(NbPoints) system.time(d <- MeanDistance(X$x, X$y)) ## user system elapsed ## 7.376 0.048 7.789 En parallèle, le temps augmente peu: la parallélisation devient réellement efficace. Ce temps est à comparer à celui de la boucle for de référence, multiplié par 2500, soit 4920 secondes. system.time(d <- TotalDistance(X$x, X$y)/NbPoints/(NbPoints - 1) * 2) ## user system elapsed ## 4.999 0.039 2.330 2.7.8 Conclusions sur l’optimisation de la vitesse du code De cette étude de cas, plusieurs enseignements peuvent être retirés: une boucle for est une bonne base pour des calculs répétitifs, plus rapide que vapply(), simple à lire et à écrire; des fonctions optimisées peuvent exister dans les packages de R pour des tâches courantes (ici, la fonction pairdist() de spatstat est deux ordres de grandeur plus rapide que la boucle for); le recours au code C++ permet d’accélérer significativement les calculs, de trois ordres de grandeur ici; la parallélisation du code C++ divise encore le temps de calcul par environ la moitié du nombre de cœurs pour de longs calculs. Au-delà de cet exemple, l’optimisation du temps de calcul sous R peut être compliquée si elle passe par la parallélisation et l’écriture de code C++. L’effort doit donc être concentré sur les calculs réellement long alors que la lisibilité du code doit rester la priorité pour le code courant. Le code C est assez facile à intégrer grâce à RCpp et sa parallélisation n’est pas très coûteuse avec RCppParallel. L’utilisation de boucles for n’est plus pénalisante depuis la version 3.5 de R. L’écriture de code vectoriel, utilisant sapply() se justifie toujours pour sa lisibilité. Le choix de paralléliser le code doit être évalué selon le temps d’exécution de chaque tâche parallélisable. S’il dépasse quelques secondes, la parallélisation se justifie. mclapply() remplace lapply() sans aucun effort, mais nécessite un hack (fourni ici) sous Windows. foreach() ne remplace pas for() aussi simplement et ne se justifie que pour des tâches très lourdes en termes de mémoire et de temps de calcul, en particulier sur des clusters de calcul. 2.8 Flux de travail Le package targets permet de gérer un flux de travail (workflow), c’est-à dire de décomposer le code en tâches élémentaires appelées cibles qui s’enchaînent, dont le résultat est stocké dans une variable, elle-même enregistrée sur le disque. En cas de changement dans le code ou les données utilisées, seules les cibles concernées sont réévaluées. Le fonctionnement du flux est proche de celui d’un cache, mais ne dépend pas de l’ordinateur sur lequel il s’exécute. targets permet de visualiser les tâches obsolètes, d’intégrer le flux à un projet de document (voir section 4.9), et même de faire appel à un cluster de calcul pour traiter les tâches en parallèle. 2.8.1 Principe de fonctionnement La documentation28 de targets est détaillée et fournit un exemple travaillé pour apprendre à utiliser le package29. Elle n’est pas reprise ici, mais les principes du fonctionnement du flux sont expliqués. Le flux de travail est unique pour un projet donné. Il est codé dans le fichier _targets.R à la racine du projet. Il contient: des commandes globales, comme le chargement des packages; une liste de cibles, qui décrivent le code à exécuter et la variable qui stocke leur résultat. Le flux est exécuté par la fonction tar_make() qui met à jour les cibles qui le nécessitent. Son contenu est placé dans le dossier _targets. Les variables stockées sont lues par tar_read(). Si le projet nécessite de longs calculs, targets permet de n’exécuter que ceux qui sont nécessaires. Si le projet est partagé ou placé sous contrôle de source (chapitre 3), le résultat des calcul est intégré l’est aussi. Enfin, si le projet est un document (chapitre 4), son formatage est complètement indépendant du calcul de son contenu, pour un gain de temps qui peut être considérable. 2.8.2 Exemple minimal L’exemple suivant est encore plus simple que celui du manuel de targets, qui permettra d’aller plus loin. Il reprend l’étude de cas précédente: un jeu de points est généré puis la distance moyenne entre les points obtenus est calculée. Une carte des points est tracée en plus. Chacune de ces trois opérations est une cible dans le vocabulaire de targets. Le fichier du flux de travail est donc le suivant: # Fichier _targets.R library("targets") tar_option_set(packages = c("spatstat", "dbmss")) list( # Tirage des points tar_target(X, runifpoint(NbPoints) ), # Paramétrage tar_target(NbPoints, 1000 ), # Distance moyenne tar_target(d, sum(pairdist(X)) / NbPoints / (NbPoints - 1) ), # Carte tar_target(map, autoplot(as.wmppp(X)) ) ) Les commandes globales consistent à charger le package targets lui-même puis lister les packages nécessaires au code. L’exécution du flux a lieu dans une nouvelle instance de R. Les cibles sont ensuite listées. Chacune est déclarée par la fonction tar_target() dont le premier argument est le nom de la cible, qui sera celui de la variable qui recevra le résultat. Le deuxième argument est le code qui produit le résultat. Les cibles sont très simples ici et peuvent être écrites en une seule commande. Quand ce n’est pas le cas, chaque cible peut être écrite sous la forme d’une fonction, stockée dans un fichier de code séparé chargé par la fonction source() au début du fichier de flux. La commande tar_visnetwork permet d’afficher l’enchaînement des cibles et leur état éventuellement obsolète. library("targets") tar_visnetwork() L’ordre de déclaration des cibles dans la liste sans importance: elles sont ordonnées automatiquement. Le flux est exécuté par tar_make(). tar_make() ## • start target NbPoints ## • built target NbPoints ## • start target X ## • built target X ## • start target d ## • built target d ## • start target map ## • built target map ## • end pipeline Le flux est maintenant à jour et tar_make() ne refait aucun calcul. tar_visnetwork() tar_make() ## ✔ skip target NbPoints ## ✔ skip target X ## ✔ skip target d ## ✔ skip target map ## ✔ skip pipeline Les résultats sont lus par tar_read(). tar_read(d) ## [1] 0.5189867 tar_read(map) 2.8.3 Intérêt pratique Dans cet exemple, targets complique l’écriture du code et tar_make() est beaucoup plus lent que la simple exécution du code qu’il traite parce qu’il doit vérifier si les cibles sont à jour. Dans un projet réel qui nécessite de longs calculs, le traitement du statut des cibles est négligeable et le gain de temps apporté par la seule évaluation des cibles nécessaires est considérable. La définition des cibles reste une contrainte, mais force à bien structurer son projet. References "],["chap-git.html", "3 Git et GitHub 3.1 Principes 3.2 Créer un nouveau dépôt 3.3 Usage courant 3.4 Branches 3.5 Usage avancé 3.6 Pages GitHub", " 3 Git et GitHub Le contrôle de source consiste à enregistrer l’ensemble des modifications apportées sur les fichiers suivis. Les avantages sont nombreux: traçabilité et sécurité du projet, possibilité de collaborer efficacement, de revenir en arrière, de tenter de nouveaux développements sans mettre en péril la version stable… 3.1 Principes 3.1.1 Contrôle de source L’outil standard est aujourd’hui git. Les commandes de git peuvent être exécutées dans le terminal de RStudio. Figure 3.1: Capture d’écran du terminal de RStudio. La commande git status supposée décrire l’état du dépôt renvoie une erreur si le projet R n’est pas sous contrôle de source. La commande git status (figure 3.1) retourne l’état du dépôt (repository), c’est-à-dire l’ensemble des données gérées par git pour suivre le projet en cours. RStudio intègre une interface graphique pour git suffisante pour se passer de la ligne de commande dans le cadre d’une utilisation standard, présentée ici. 3.1.2 git et GitHub git est le logiciel installé sur le poste de travail. GitHub est une plateforme, accessible par le web30, qui permet de partager le contenu des dépôts git (pour travailler à plusieurs) et de partager de la documentation sous la forme d’un site web (GitHub Pages). Comme GitHub permet au minimum la sauvegarde des dépôts git, les deux sont toujours utilisés ensemble. GitHub n’est pas la seule plateforme utilisable mais la principale. Les alternatives sont Bitbucket31 et GitLab32 par exemple. 3.2 Créer un nouveau dépôt 3.2.1 A partir d’un projet existant Dans un projet R existant, activer le contrôle de source dans les options du projet (figure 3.2). La commande exécutée est git init. Redémarrer RStudio à la demande. Figure 3.2: Activation du contrôle de source dans le menu “Tools > Project Options…”. Une nouvelle fenêtre Git apparaît dans le panneau supérieur droit. Elle contient la liste des fichiers du projet (figure 3.3). Figure 3.3: Fichiers du projet, pas encore pris en compte par git. A ce stade, les fichiers ne sont pas pris en compte par git: leur statut est un double point d’interrogation jaune. Pour git, le répertoire de travail local est un bac à sable où toutes les modifications sont possibles sans conséquences. Le fichier .gitignore contient la liste des fichiers qui n’ont jamais vocation à être pris en compte, qu’il est donc inutile d’afficher dans la liste: les fichiers intermédiaires produits automatiquement par exemple. La syntaxe des fichiers .gitignore est détaillée dans la documentation de git33. En règle générale, utiliser un fichier existant: les modèles de documents notamment incluent leur fichier .gitignore. 3.2.2 Prendre en compte des fichiers Dans la fenêtre git, cocher la case Staged permet de prendre en compte (Stage) chaque fichier. La commande exécutée est git add <NomDeFichier>. Les fichiers pris en compte une première fois ont le statut “A” pour “Added”. Les fichiers pris en compte font partie de l’index de git. 3.2.3 Valider des modifications Figure 3.4: Fenêtre de validation des modifications prises en compte. Les fichiers pris en compte peuvent être validés (Commit) en cliquant sur le bouton “Commit” dans la fenêtre Git. Une nouvelle fenêtre s’ouvre (figure 3.4), qui permet de visualiser toutes les modifications par fichier (ajouts en verts, suppressions en rouge). Le grain de modification traité par git est la ligne de texte, terminée par un retour à la ligne. Les fichiers binaires comme les images sont traités en bloc. Chaque validation (Commit) est accompagnée d’un texte de description. La première ligne est la description courte. Une description détaillée peut être ajoutée après un saut de ligne. Pour la lisibilité de l’historique du projet, chaque commit correspond donc à une action, correspondant à la description courte: tous les fichiers modifiés ne sont pas forcément pris en compte et validés en une fois. La commande exécutée est git commit -m \"Message de validation\". Figure 3.5: Fenêtre de demande d’identification. Les validations sont liées à leur auteur, qui doit être identifié par git. En règle générale, git utilise les informations du système. S’il n’y parvient pas, une fenêtre demande à l’utilisateur de s’identifier avant d’effectuer son premier commit (figure 3.5). Les commandes indiquées sont à exécuter dans le terminal de RStudio. Elles peuvent aussi être utilisées pour vérifier les valeurs connues par git: git config user.name git config user.email Dès la première validation, la branche principale du dépôt, appelée “master”, est créée. Une branche est une version du dépôt, avec son propre historique et donc ses propres fichiers. Les branches permettent: de développer de nouvelles fonctionnalités dans un projet, sans perturber la branche principale qui peut contenir une version stable. Si le développement est retenu, sa branche pourra être fusionnée avec la branche master pour constituer une nouvelle version stable. de contenir des fichiers totalement différents de ceux de la branche principale, pour d’autres objectifs. Sur GitHub, les pages web de présentation du projet peuvent être placés dans une branche appelée “gh-pages” qui ne sera jamais fusionnée. Le dépôt git est complètement constitué. Dans le vocabulaire de git, il comprend trois arbres (figure 3.6): le répertoire de travail, ou bac à sable, qui contient les fichiers non pris en compte: inconnus, modifiés, supprimés ou renommés (case Staged décochée); l’index, qui contient les fichiers pris en compte (case Staged cochée); la tête, qui contient les fichiers validés. Figure 3.6: Les trois arbres de git. Source: https://rogerdudler.github.io/git-guide/index.fr.html Le statut des fichiers est représenté par deux icônes dans la fenêtre Git de RStudio: deux points d’interrogation quand ils n’ont pas été pris en compte par git. Ensuite, l’icône de droite décrit la différence entre le le répertoire de travail et l’index. Celle de gauche décrit la différence entre l’index et la tête. Un fichier modifié aura donc l’icône M affichée à droite avant d’être pris en compte, puis à gauche après prise en compte. Il est possible, même s’il vaut mieux l’éviter, de modifier à nouveau un fichier pris en compte avant qu’il soit validé: alors, les deux icônes seront affichées. 3.2.4 Créer un dépôt vide sur GitHub Figure 3.7: Création d’un dépôt sur GitHub. Un dépôt vide sur GitHub doit être créé (figure 3.7): Sur GitHub, cliquer sur le bouton vert “New repository”. Saisir le nom du dépôt, identique à celui du projet R local. Ajouter une description, qui apparaîtra uniquement sur la page GitHub du dépôt. Choisir le statut du dépôt: Public: visible par tout le monde Privé: visible seulement par les collaborateurs du projet, ce qui exclut de compléter par des pages web de présentation. Ne pas ajouter de README, .gitignore ou licence: le projet doit être vide. Cliquer sur “create Repository”. Copier l’adresse du dépôt (https://github.com/… ou git@github.com:…) Le choix de l’adresse est lié à la méthode d’authentification. L’authentification SSH (voir section 1.4.3) est à privilégier. 3.2.5 Lier git et GitHub Dans RStudio, un premier commit doit au moins avoir eu lieu pour que la branche principale du projet, nommée “master”, existe. En haut à droite de la fenêtre Git (figure 3.3), il est affiché “(no branch)” avant cela. Ensuite, il est affiché “master”, le nom par défaut de la branche principale du projet. Le projet peut alors être lié au dépôt GitHub. 3.2.5.1 Méthode graphique Cliquer sur le bouton violet à côté de “master”: une fenêtre apparaît (habituellement utilisée pour la création d’une nouvelle branche, voir section 3.4). Saisir le nom de la branche “master”, cliquer sur “Add Remotes” et compléter: Remote Name: origin; Remote URL: coller l’adresse du dépôt GitHub; Cliquer sur “Add”. Cocher la case “Sync with Remote”. Au message indiquant qu’une branche master existe déjà, cliquer sur “Overwrite”. 3.2.5.2 En ligne de commande Plutôt que la manipulation précédente, le lien entre Git et GitHub peut être mis en place par quelques commandes de git exécutées dans le terminal de RStudio. Elles sont affichées sur la page d’accueil de tout dépôt vide nouvellement créé sur GitHub et peuvent donc être copiées et collées directement vers le terminal. git remote add origin git@github.com:GitHubID/NomDuDepot.git git branch -M master git push -u origin master La première commande déclare le dépôt GitHub comme dépôt distant. Le nom origin est une convention de git. Il peut être modifié mais l’organisation du projet sera plus lisible en respectant la convention. L’adresse du dépôt est https://github.com/GitHubID/NomDuDepot.git si l’authentification HTTPS est choisie. Les commandes suivantes activent la branche principale du projet et poussent son contenu vers GitHub. Attention au nom de la branche principale (voir section 3.4): par défaut, elle s’appelle “master” dans un projet créé dans RStudio mais “main” sur GitHub. Les lignes de commande ci-dessus fournies par GitHub remplacent donc master par main et doivent être corrigées pour correspondre au nom de la branche créée par RStudio. 3.2.5.3 Authentification Si l’authentification HTTPS est choisie, à la première connexion de RStudio à GitHub, une fenêtre permet de saisir ses identifiants GitHub (figure 3.8). Figure 3.8: Identification HTTPS sur GitHub. Depuis août 2021, GitHub n’accepte plus le mot de passe du compte de l’utilisateur pour cette authentification: le jeton personnel (PAT) créé en section 1.4.4 doit être saisi à sa place. Si l’authentification SSH est choisie et a été configurée à l’installation de git (section 1.4.3), aucune action n’est nécessaire. 3.2.6 Pousser les premières modifications La manipulation précédente a automatiquement poussé (Push) les modifications validées sur GitHub. Par la suite, il faudra cliquer sur le bouton “Push” de la fenêtre Git pour le faire. Sur GitHub, les fichiers résultant des modifications enregistrées par git sont maintenant visibles. Chaque commit réalisé localement est compté par git et un message “Your branch is ahead of ‘origin/master’ by n commits” affiché dans en haut de la fenêtre Git indique qu’il est temps de mettre à jour GitHub en poussant l’ensemble de ces commits. Cliquer sur le bouton “Push” pour le faire. A ce stade, le projet doit disposer d’un fichier README.md qui présente son contenu sur GitHub. Son contenu minimal est un titre et quelques lignes de description: # Nom du Projet Description en quelques lignes. Il est conseillé d’utiliser des badges34, à placer juste après le titre, pour déclarer l’état de maturité du projet, par exemple: ![stability-wip](https://img.shields.io/badge/|> stability-work_in_progress-lightgrey.svg) 3.2.7 Cloner un dépôt de GitHub Figure 3.9: Clonage d’un dépôt à partir de GitHub. Tout dépôt sur GitHub peut être installé (on dit cloné) sur le poste de travail en copiant son adresse qui apparaît en cliquant sur le bouton vert (figure 3.9). Dans RStudio, créer un nouveau projet et, dans l’assistant, choisir “Version Control”, “Git” et coller l’adresse dans le champ “Repository URL”. Le nom répertoire à créer pour le projet est déduit automatiquement de l’adresse. Choisir le répertoire dans lequel celui du projet va être créé et cliquer sur “Create Project”. Le projet créé est lié au dépôt distant sur GitHub. Pour travailler à plusieurs sur le même projet, le propriétaire du projet doit donner l’accès au projet à des collaborateurs (figure 3.10), c’est-à-dire d’autres utilisateurs GitHub dans les réglages du dépôt (Settings). Figure 3.10: Attribution des droits d’accès sur GitHub. Les collaborateurs sont invités par un message envoyé par GitHub. 3.3 Usage courant 3.3.1 Tirer, modifier, valider, pousser Toute séance de travail sur un projet commence en tirant (Bouton “Pull”) de la fenêtre Git pour intégrer au dépôt local les mises à jour effectuées sur GitHub par d’autres collaborateurs. Les modifications apportées aux fichiers du projet sont ensuite prises en compte (cocher les cases Staged) et validées (Commit) avec un message explicatif. Une bonne pratique consiste à valider les modifications à chaque fois qu’une tâche élémentaire, qui peut être décrite dans le message explicatif, est terminée plutôt que d’effectuer des commits regroupant de nombreux changements avec une description vague. Dès que possible, pousser (Push) les mises à jour pour qu’elles soient visibles par les collaborateurs. 3.3.2 Régler les conflits Il n’est pas possible de pousser les modifications validées si un collaborateur a modifié le dépôt distant sur GitHub. Il faut alors les tirer pour les intégrer au dépôt local avant de pousser les modifications fusionnées. Un conflit a lieu si un Pull importe dans le fichier local une modification qui ne peut pas être fusionnée automatiquement parce qu’une modification contradictoire a eu lieu localement. Git considère chaque ligne comme un élément indivisible: la modification de la même ligne sur le dépôt distant et le dépôt local génère donc un conflit. Git insère dans le fichier contenant un conflit les deux versions avec une présentation particulière: <<<<<<<<< HEAD # Version importée du conflit Lignes en conflit, version importée ========= # limite entre les deux versions Lignes en conflit, version locale >>>>>>>>> # Fin du conflit Les lignes de formatage contenant les <<<<, les ==== et les >>>> doivent être supprimés et une seule version des lignes problématiques conservée, qui peut être différente des deux versions originales. La résolution du conflit doit être prise en compte et validée. Pour limiter les conflits dans un document contenant du texte (typiquement, un document R Markdown), une bonne pratique consiste à traiter chaque phrase comme une ligne, terminée par un retour à la ligne qui ne sera pas visible dans le document mis en forme: un saut de ligne est nécessaire pour séparer les paragraphes. 3.3.3 Voir les différences Dans la fenêtre Git de RStudio, le menu contextuel (affiché par un clic droit) “Diff” peut être utilisé pour afficher les modifications apportées à chaque fichier (figure 3.11). Figure 3.11: Différences entre le répertoire de travail et la tête. 3.3.4 Revenir en arrière Le menu contextuel “Revert” permet d’annuler toutes les modifications apportées à un fichier (affichées par Diff) et de rétablir son contenu validé la dernière fois (son état dans la tête). Il n’est pas simple de revenir en arrière au-delà de la dernière validation parce que les modifications ont pu être prises en compte par des collaborateurs: leur suppression rendrait le projet incohérent. 3.3.5 Voir l’historique Le bouton en forme d’horloge de la fenêtre Git de RStudio affiche l’historique du projet (figure 3.12). Figure 3.12: Historique des validations dans le dépôt. En haut se trouve la tête, puis toutes les validations (commits) qui l’ont constituée. Pour chaque validation, les différences de chaque fichier peuvent être affichées en cliquant sur le nom du fichier dans la partie basse de la fenêtre. 3.4 Branches Les branches d’un projet sont des versions différentes mais simultanées. Un usage typique est le développement d’une nouvelle fonctionnalité. Si son écriture prend du temps, le projet est perturbé par le chantier en cours: le code peut ne plus fonctionner. Si le développement s’avère impossible ou inutile, il faut pouvoir l’abandonner sans dommage. Pour l’isoler pendant sa réalisation et se permettre de le valider ou de l’abandonner à la fin, il faut le placer dans une branche. La branche principale du projet s’appelle “master” ou “main” à partir de novembre 202035. Elle doit toujours être dans un état stable: c’est elle qui est clonée à partir de GitHub par d’autres utilisateurs éventuels. Le changement de convention pour le nom de la branche “master” fait qu’à partir de novembre 2020, les projets créés sur GitHub clonés dans RStudio ont pour branche principale “main” alors que les projets créés sur RStudio puis liés à GitHub conservent le nom “master”. 3.4.1 Créer une nouvelle branche Cliquer sur le bouton violet “New Branch” dans la fenêtre git de RStudio. Saisir son nom et cliquer sur “Create”. La nouvelle branche est maintenant active. Les commandes git peuvent aussi être exécutées dans le terminal (pour créer la branche et l’activer): git branch new_branch git checkout new_branch 3.4.2 Changer de branche Sélectionner la branche à activer dans la liste des branches locales de la la fenêtre git. Les commits s’appliquent à la branche active. Chaque branche se comporte comme une version différente du projet. Attention: pour éviter la confusion, sauvegarder les modifications, prendre en compte et valider les changements avant de changer de branche. 3.4.3 Pousser la nouvelle branche Les premières modifications de la nouvelle branche doivent être poussées en ligne de commande parce que les boutons “Push” et “Pull” de la fenêtre Git ne fonctionnent pas tant que la branche n’existe pas sur le dépôt distant. Exécuter, dans le terminal: git push -u origin new_branch 3.4.4 Comportement du système de fichier A chaque changement de branche, git réécrit les fichiers du projet pour qu’ils reflètent l’état de la branche. Les changements peuvent être observés hors de RStudio, dans l’explorateur de fichier par exemple. Les fichiers ignorés par .gitignore ne sont pas modifiés. Il est donc indispensable que les fichiers .gitignore des différentes branches soit identiques, sinon des fichiers ignorés dans une branche apparaîtront comme ajoutés dans la branche affichée après un changement. Les branches de développement ont un contenu proche de celui de la branche principale. Ce n’est pas le cas de branches spécialisées vues plus loin, comme gh-pages (voir section 3.6) qui contient le site web de présentation du dépôt. Il est préférable de ne pas tenter d’afficher ces branches dans RStudio: leur contenu est produit automatiquement et ne doit pas être modifié manuellement. Si c’est indispensable, il faudra y copier le fichier .gitignore de la branche principale et garder à l’esprit que les fichiers ignorés appartiennent en réalité à une autre branche que celle affichée. 3.4.5 Fusionner avec merge La fusion d’une branche de développement avec la branche principale marque l’atteinte de son objectif: son code va être intégré au projet. L’interface graphique de RStudio ne prévoit pas les fusions, il faut donc utiliser le terminal: tout d’abord, se placer dans la branche cible (possible avec l’interface graphique): git checkout master Ensuite, fusionner: git merge new_branch Dans la majorité des situations, la fusion sera automatique (“Fast Forward”). Il est possible que des conflits apparaissent: utiliser la commande git status pour afficher la liste des fichiers concernés, les ouvrir, régler le confit et effectuer un commit. La branche fusionnée n’est pas supprimée: elles peut être utilisée à nouveau pour d’autres développements ou supprimée manuellement avec la commande suivante: git branch -d new_branch 3.4.6 Fusionner avec une requête de tirage L’autre façon de fusionner est plus formelle mais aussi plus générale: elle permet de fusionner une branche dans un dépôt d’un autre utilisateur pour y contribuer, ou de faire valider sa branche par un autre membre de l’équipe dans un projet collaboratif. Pour contribuer au projet d’un autre utilisateur de GitHub36, il faut commencer par en créer un fork, c’est-à-dire une copie sous la forme d’un dépôt lié à l’original. Il sera possible de tirer les modifications de l’original pour rester à jour37 (par opposition à une simple copie instantanée possible en téléchargeant un Zip du projet) et, à la fin du développement, de fusionner le fork au dépôt original (par opposition à un clone qui ne permettrait pas de contribuer par la suite). Ensuite, il faut créer une branche de développement comme précédemment, la modifier et finalement demander au propriétaire du dépôt de la fusionner. Ce processus est décrit en détail dans la documentation de git . Dans le cadre plus simple d’une branche de son propre projet comme dans le cas d’un fork, la branche de développement est prête à être fusionnée. Elle doit avoir être poussée sur GitHub. Sur la page GitHub du projet, un bouton “Create Pull Request” permet de demander la fusion. Un message décrivant les modifications proposées avec leur argumentaire doit être ajouté. Le propriétaire du projet (les membres de l’équipe dans le cadre d’un projet collaboratif, ou soi-même si l’équipe se réduit à une personne) est averti de la requête de tirage. Sur la page du projet original, il est possible de voir le message, la liste des modifications (chronologie des commits ou comparaison des fichiers), d’engager un discussion avec l’auteur de la requête… Si la requête n’est pas retenue, elle peut être fermée. Si elle est validée, le bouton “Merge Pull Request” permet de fusionner la branche de développement avec la branche “master” (ou une autre) du projet source. Les requêtes de tirage sont le seul moyen de contribuer à un dépôt sur lequel on ne dispose pas de droits d’écriture. C’est aussi le moyen de fusionner une branche de développement dans sont propre projet en en gardant une trace explicite (dans la rubrique Pull requests de la page GitHub du projet). Dans le cadre d’un projet collaboratif, les propositions d’un membre (auteur de la requête) peuvent être validées par un autre (qui accepte la fusion). 3.5 Usage avancé 3.5.1 Commandes de git Au-delà de l’usage courant permis par l’interface graphique de RStudio, des manipulations avancées des projets sont permises en utilisant git en ligne de commande. Quelques exemples utiles sont présentés ici. Un petit guide des commandes est proposé par Roger Dudler38. Il résume les commandes essentielles, donc intégrées à l’interface graphique de RStudio. Des liens vers des références plus complètes sont donnés en bas de la page. 3.5.2 Taille d’un dépôt Pour connaître l’espace disque occupé par un dépôt, utiliser la commande git count-objects -vH39. Les données pour ce document au stade de la rédaction sont présentées à titre d’exemple. $ git count-objects -v count: 200 size: 2.66 MiB in-pack: 0 packs: 0 size-pack: 0 prune-packable: 0 garbage: 0 size-garbage: 0 La taille totale est sur la ligne size. Les packs sont une méthode utilisée par git pour réduire la taille du dépôt: des fichiers similaires sont stockés sous la forme d’une partie commune et de différences. La ligne prune-packable donne la taille d’objets stockés à la fois sous forme individuelle et dans des packs. Si leur taille est importante, exécuter git prune-packed pour la ramener à zéro. La ligne size-garbage donne la taille des objets qui peuvent être supprimés. git gc les supprime, mais pas seulement: il optimise le stockage. $ git gc Enumerating objects: 194, done. Counting objects: 100% (194/194), done. Delta compression using up to 8 threads Compressing objects: 100% (188/188), done. Writing objects: 100% (194/194), done. Total 194 (delta 83), reused 0 (delta 0) $ git count-objects -vH count: 1 size: 5.72 KiB in-pack: 194 packs: 1 size-pack: 4.00 MiB prune-packable: 0 garbage: 0 size-garbage: 0 bytes Ici, la majorité des objets du dépôt a été placée dans un pack (mais sa taille est supérieure à celle des objets individuels). Il est généralement inutile d’effectuer la collecte des déchets manuellement: git gère bien l’organisation de ses dépôts. GitHub limite la taille des dépôts. En mai 2020, la limite est de 100 Go. La taille de tous les dépôts d’un utilisateur authentifié peut être affichée dans les réglages de son compte (“Personnal Settings”, “Repositories”)40. 3.5.3 Supprimer un dossier Toutes les modifications apportées à un dépôt sont stockées dans son historique. Il peut être utile d’en supprimer dans quelques cas particuliers: si un fichier contenant des informations confidentielles a été validé par mégarde. La validation de sa suppression ne le retire pas de l’historique, et les informations confidentielles restent visibles en consultant l’historique. si des fichiers volumineux ne sont plus nécessaires, par exemple des fichiers PDF produits par R Markdown (chapitre 4), binaires (donc inadaptés à git) et reproductibles à partir du code. Typiquement, le dossier docs est utilisé pour stocker les documents produits à partir de code R Markdown. Les fichiers HTML et PDF doivent s’y trouver pour constituer les pages GitHub du projet. Chaque modification du dépôt génère une nouvelle version de ces fichiers dont le volume de l’historique devient rapidement considérable. Une solution efficace consiste à déléguer la création de ces fichiers à un système d’intégration continue (chapitre 6) et à retirer le dossier docs de la branche principale (master) du dépôt. Il faut alors supprimer tout son historique pour récupérer la place qu’il occupe, qui peut être l’essentiel de la taille du dépôt. Les commandes de suppression complète d’un dossier d’un dépôt son présentées ici41. Le dépôt doit être propre, c’est-à-dire sans modifications non validées, et les versions distantes et locales synchronisées. Les trois commandes suivantes suppriment complètement le dossier docs de l’historique du dépôt git: git filter-branch --tree-filter "rm -rf docs" |> --prune-empty HEAD git for-each-ref --format="%(refname)" refs/original/ |> | xargs -n 1 git update-ref -d Le dossier n’est pas supprimé du répertoire de travail. Il doit donc être ajouté au fichier .gitignore pour ne plus être suivi. La modification de .gitignore doit être validée. Ces opérations peuvent être réalisées avec l’interface de RStudio ou en ligne de commande: echo docs/ >> .gitignore git add .gitignore git commit -m 'Removing docs folder from git history' Le nettoyage du dépôt est nécessaire pour supprimer physiquement les données retirées: git gc Enfin, le dépôt doit être poussé. L’option --force implique le remplacement du contenu du dépôt distant par celui du dépôt local: toutes les modifications faites par des collaborateurs sont effacées, c’est pourquoi cette opération de nettoyage implique l’arrêt complet du projet pendant qu’elle a lieu. git push origin master --force Ce code peut être utilisé pour supprimer totalement n’importe quel fichier ou dossier d’un dépôt en remplaçant simplement docs dans la commande git filter-branch initiale. La réduction de la taille du dépôt peut être suivie en utilisant git count-objects -vH avant l’opération, avant git gc (la taille du dépôt reste stable mais a été déplacée vers garbage) et à la fin (la taille du dépôt est sensiblement réduite). 3.5.4 Revenir en arrière Il est possible de restaurer un dépôt dans un état précédent en plaçant sa tête (figure 3.6) au niveau d’un ancien commit. Toutes les modifications ultérieures sont alors détruites. Cette opération ne doit pas être réalisée sur un dépôt partagé: les autres utilisateurs ne pourraient plus pousser leurs modifications. Afficher l’historique du dépôt et rechercher l’identifiant (SHA) du dernier commit à conserver. Dans le terminal de RStudio, exécuter: git reset --hard <SHA> git push -f Tout l’historique du dépôt après le point de restauration choisi est perdu. Une méthode moins radicale et utilisable sur un dépôt partagé consiste à exécuter un commit qui annule les modifications d’un autre mais ne détruit aucune donnée de l’historique. Cette opération n’annule qu’un seul commit à la fois et doit donc être répétée pour en annuler plusieurs, en commençant par le plus récent. Dans le terminal de RStudio, exécuter: git revert <SHA> Pour annuler le dernier commit, exécuter: git revert HEAD Utiliser HEAD évite simplement de rechercher l’identifiant correspondant. 3.6 Pages GitHub Tout projet sur GitHub doit avoir contenir un fichier README.md pour le présenter. Ce fichier est écrit au format Markdown. Le fichier peut être placé dans le dossier docs pour fournir à fois la page d’accueil du dépôt et de son site web. Le package memoiR fournit des commandes permettant d’automatiser ces tâches dans les projets de documents. Un dépôt contenant un mémo écrit en R Markdown (voir section 4.3.2) est utilisé comme exemple42. Son fichier README.md existe aux deux emplacements: il est écrit par le développeur à la racine du projet et dupliqué par GitHubPages.R. 3.6.1 Activation Pour activer les pages GitHub, il faut ouvrir les propriétés du dépôt (Settings) et modifier la rubrique “GitHub Pages” (dans “Options”). Sélectionner la branche du projet et le dossier contenant les pages web, ici: master et /docs. En option, le choix d’un thème personnalise l’apparence des pages. Le site web est accessible à une adresse43 du domaine github.io. Le fichier README.md affiché en page d’accueil a un aspect très différent mais le même contenu que celui affiché avec le code sur la page du dépôt dans GitHub. L’intérêt des pages GitHub est de permettre un accès simple aux documents formatés quand le dépôt contient une production écrite et ou à la documentation des packages R. Ces contenus seront présentés dans le chapitre suivant. Un site web principal est proposé avec chaque compte GitHub, à l’adresse https://GitHubID.github.io44. Il sera utilisé pour héberger un site web personnel produit par blogdown. 3.6.2 Badges Les badges sont de petites images, éventuellement mises à jour dynamiquement, qui renseignent rapidement sur le statut d’un projet. Ils doivent être placés immédiatement après le titre du fichier README.md. Une bonne pratique consiste à indiquer l’avancement dans le cycle de vie du projet. Les badges correspondants sont listés sur le site du Tidyverse45. Leur code Markdown est le suivant: ![stability-wip] (https://img.shields.io/badge/lifecycle-maturing-blue.svg) Le package usethis simplifie leur création en plaçant le code nécessaire dans le presse-papier. Il suffit ensuite de le coller dans le fichier. usethis::use_lifecycle_badge("maturing") https://github.com/↩︎ https://bitbucket.org/↩︎ https://about.gitlab.com/↩︎ https://git-scm.com/docs/gitignore↩︎ https://github.com/orangemug/stability-badges↩︎ https://github.com/github/renaming↩︎ https://git-scm.com/book/fr/v2/GitHub-Contribution-%C3%A0-un-projet↩︎ https://ardalis.com/syncing-a-fork-of-a-github-repository-with-upstream/↩︎ https://rogerdudler.github.io/git-guide/index.fr.html↩︎ https://git-scm.com/docs/git-count-objects↩︎ https://github.com/settings/repositories↩︎ https://stackoverflow.com/questions/10067848/remove-folder-and-its-contents-from-git-githubs-history↩︎ https://github.com/EricMarcon/Krigeage↩︎ https://EricMarcon.github.io/Krigeage/↩︎ Exemple: https://EricMarcon.github.io/Krigeage/↩︎ https://www.tidyverse.org/lifecycle/↩︎ "],["chap-rediger.html", "4 Rédiger 4.1 Bloc-note Markdown (R Notebook) 4.2 Modèles R Markdown 4.3 Articles avec bookdown 4.4 Présentation Beamer 4.5 memoir 4.6 Site web R Markdown 4.7 Site web personnel : blogdown 4.8 Exportation de figures 4.9 Flux de travail", " 4 Rédiger R et RStudio permettent de rédiger efficacement des documents de tous formats, du simple bloc-note à la thèse, en passant par des diaporamas. Les outils pour le faire sont l’objet de ce chapitre, complété par la production de sites web (y compris un site personnel). 4.1 Bloc-note Markdown (R Notebook) Dans un fichier .R, le code doit toujours être commenté pour faciliter sa lecture. Quand l’explication du code nécessite plusieurs lignes de commentaire par ligne ou bloc de code, il est temps d’inverser la logique et de placer le code dans un texte. Le concept de programmation lettrée (literate programming) a été développé par Knuth (1984). Il s’agit de décrire les objectifs et les méthodes par du texte, dans lequel le code s’intègre. L’outil le plus simple est le bloc-note Markdown (Menu “File > New File > R Notebook”). Le modèle de document contient son mode d’emploi. Le langage qui permet de formater le texte est Markdown46, un langage de balisage simple à utiliser: Les paragraphes sont séparés par des sauts de ligne; Le document est structuré par des titres: leur ligne commence par un nombre de # correspondant à leur niveau; Les formats de caractères sont limités à l’essentiel: italique ou gras (texte entouré par une ou deux *); D’autres codes simples permettent tous les formatages utiles. Ce langage est le pivot du logiciel pandoc47, dédié à la conversion de documents de formats différents. Le package rmarkdown (Xie 2015) fait le lien entre R et Markdown, en s’appuyant sur l’interface de RStudio qui n’est pas indispensable mais simplifie énormément son utilisation. Le dialecte de Markdown utilisé par le package est appelé R Markdown. Sa syntaxe est résumée dans une antisèche48. Sa documentation complète est en ligne (Xie, Allaire, et Grolemund 2018). Les équations sont écrites au format LaTeX49. L’organisation la plus simple d’un document R Markdown est visible dans le modèle de bloc-note. Il commence par un en-tête au format YAML50: --- title: "R Notebook" output: html_notebook --- La première entrée est le titre, la seconde le format de sortie: plus précisément le nom de la fonction chargée de traiter le document. Le document contient du texte formaté en Markdown et des bouts de code (code chunks) entourés par trois accents graves (la syntaxe markdown d’un bloc de code) et une description du langage, ici r. Ces bouts de code sont traités par knitr qui transforme le résultat de l’exécution du code R en Markdown et l’intègre au texte du document. Traiter un document R Markdown s’appelle le tricoter (knit). La chaîne de production est la suivante : knitr traite les bouts de code: calculs, production de figures; rmarkdown intègre la production des bouts de code et texte pour produire un fichier Markdown standard; pandoc (installé avec RStudio) convertit ce fichier au format HTML, LaTeX ou Word; LaTeX produit un fichier PDF quand ce format est demandé. RStudio permet de lancer le tricot par des boutons plutôt que par des commandes: dans la fenêtre source (celle du haut à gauche), un bouton “Knit” accompagne les documents R Markdown. Pour les bloc-notes R Markdown, il est remplacé par un bouton “Preview” avec les mêmes fonctions. Il peut être déroulé pour choisir le format de sortie: HTML, Word, PDF (en passant par LaTeX) et, pour les bloc-notes, une commande “Preview” qui affiche le document en HTML sans exécuter les bouts de code pour gagner du temps. Dès le premier tricot au format Word ou HTML, on remarquera que le bouton “Preview” disparaît. Au final, l’utilisation de R Markdown combine plusieurs avantages: La simplicité de la rédaction: le texte brut est plus facile à lire et à formater qu’en LaTeX par exemple; L’automatisation de la production: le formatage et la mise en page sont entièrement automatiques; La reproductibilité: chaque document peut être autosuffisant accompagné de ses données. Relancer le tricotage régénère entièrement le document, y compris les calculs nécessaires et la production des figures. Elle a aussi quelques inconvénients: Le formatage dépend de modèles, et developper de nouveaux modèles n’est pas simple; Les erreurs de tricot sont parfois difficiles à corriger, notamment quand elles interviennent à l’étape de la compilation LaTeX; La reproductibilité consomme du temps de calcul. Pour limiter ce problème, un système de cache permet de ne pas réévaluer tous les bouts de code R à chaque modification du texte. La production de gros documents peut aussi être déléguée à un système d’intégration continue (chapitre 6). 4.2 Modèles R Markdown Des modèles de document plus élaborés que le bloc-note sont fournis par des packages, dont rmarkdown. Ils sont accessibles par le menu “File > New File > R Markdown…” (figure 4.1)). Figure 4.1: Nouveau document Markdown à partir d’un modèle. Les modèles les plus simples sont Document et Presentation. Les informations à fournir sont le titre et le nom de l’auteur, et le format du document attendu (qui pourra être modifié plus tard). Ces modèles créent un seul fichier dont l’enregistrement ne sera obligatoire qu’au moment de tricoter. La syntaxe est la même que celle du bloc-note. Dans l’entête, une entrée supplémentaire est utilisée pour la date, qui peut être calculée par R à chaque tricot: date: "|r format(Sys.Date(), '%d/%m/%Y')|" Remplacer les barres verticales | de l’exemple ci-dessus par des guillemets inversés: ce document étant écrit avec R Markdown, la date serait calculée et affichée à la place du code si les guillemets inversés étaient utilisés directement. Le code R en ligne (par opposition aux bouts de code) peut être utilisé partout dans un document R Markdown, y compris dans l’entête pour l’affichage de la date. Il commence par un guillemet inversé suivi de r et se termine par un autre guillemet inversé. Les documents peuvent être tricotés au format HTML, PDF (via LaTeX) ou Word. L’entête du fichier R Markdown est réécrit quand le tricot est lancé par le bouton de RStudio qui place en premier le format de sortie utilisé et l’ajoute si nécessaire. Les présentations peuvent être tricotées dans deux formats HTML, ioslide51 ou Slidy52, au format Beamer (PDF)53 ou en Powerpoint54. Le niveau 2 de plan (##) marque le changement de diapositive. Du code supplémentaire, présenté dans les documentations des formats HTML, permet d’utiliser des fonctionnalités spécifiques. Ces modèles sont simples mais assez peu utiles: le bloc-note R est plus facile à utiliser que le modèle de document pour des documents minimalistes. Des modèles plus élaborés sont disponibles. 4.3 Articles avec bookdown R Markdown ne permet pas de rédiger un article scientifique. La bibliographie ne pose pas de problème parce qu’elle est gérée par pandoc pour les documents HTML ou Word et sous-traitée à LaTeX pour les documents PDF. Les équations, figures et tableaux sont numérotés par LaTeX mais pas en HTML. Les références croisées (les renvois à un numéro de figure par exemple) ne sont pas supportés. Enfin, les légendes de figures ou tableaux ne supportent que du texte brut, sans aucun formatage. bookdown comble ces manques. Le package a été conçu pour la rédaction d’ouvrages comportant plusieurs chapitres mais peut être utilisé pour des articles. Le package ne fournit pas directement de modèles. Le package memoiR fournit les modèles présentés ici. Il doit être installé. 4.3.1 Ecrire Les principales caractéristiques de Markdown sont résumées ici. Une formation rapide et plus complète est proposée par RStudio55. Le texte est écrit sans aucun autre formatage que les les retours à la ligne. Un simple retour à la ligne n’a aucun effet sur le document produit: il permet de séparer les phrases pour simplifier le suivi du code source par git. Un saut de ligne marque un changement de paragraphe. Les différents niveaux de plan sont désignés par le nombre de croisillons correspondant en début de ligne: # pour un titre de niveau 1, ## pour un titre de niveau 2, etc. Un espace sépare les croisillons et le texte du titre. Les liste à puces sont marquées par un tiret (suivi d’un espace) en début de ligne. Un saut de ligne est nécessaire avant le début de la liste mais les éléments de la liste sont séparés par un simple retour à la ligne. Les listes indentées sont créées en insérant 4 espaces avant le tiret de début de ligne. Enfin, les listes numérotées sont créées de la même façon en remplaçant les tirets par des nombres, dont la valeur n’a pas d’importance. Dans le texte, les parties en italique sont entourées par une étoile ou un tiret bas (*italique*), alors que deux étoiles marquent le gras. 4.3.1.1 Code R Le code R est inclus dans des bouts de code (code chunks) créés facilement en cliquant sur le bouton “Insert a new code chunk” au-dessus de la fenêtre du code source dans RStudio. Ils commencent et se terminent par trois guillemets inversés sur une nouvelle ligne. Ces bouts de code peuvent contenir du code R mais aussi Python par exemple: le type de code est indiqué dans l’entête sur la première ligne, avant le nom du bout de code, puis une liste d’options séparées par des virgules, par exemple: ```{r cars, echo=TRUE} ``` Le nom et les options sont facultatifs: l’entête minimal est {r}. Les options les plus utiles sont : echo pour afficher (=TRUE) ou cacher (=FALSE) le code; message=FALSE pour cacher les messages d’ouverture de certains packages; warning=FALSE pour cacher les avertissements. Les options par défaut sont déclarées dans le bout de code nommé “Options” au début du document Markdown, dans la fonction opts_chunk$set(). L’option echo doit être mise à FALSE par défaut pour un article scientifique par exemple. 4.3.1.2 Figures plot(pressure) Figure 4.2: Titre de la figure Les figures peuvent être créées par le code R (figure 4.2). Avec Bookdown, une étiquette est associée à chaque figure: son nom est fig:xxx où xxx est le nom du bout de code R. Les renvois se font avec la commande \\@ref(fig:xxx). L’entête du bout de code de la figure 4.2 est: ```{r pressure, fig.cap="Titre de la figure"} ``` Il contient au minimum le nom de la figure et sa légende. Si la légende est longue, l’entête est peu lisible. De plus, la légende est limitée à du texte simple. Pour des légendes plus élaborées, il est possible de déclarer la légende dans un paragraphe séparé qui commence par le texte (ref:NomFigure). La figure 4.3 bénéficie d’une légende améliorée. Figure 4.3: Titre avec italique, maths (\\(\\sqrt\\pi\\)) et renvoi vers la figure 4.2 Le texte de fig.cap, “Titre de la figure” précédemment, est remplacé par (ref:pressure) à l’intérieur des guillemets qui sont conservés et la légende est saisie dans un paragraphe commençant par (ref:pressure) suivi d’un espace. Les légendes sont limitées à un paragraphe unique. Si une table des figures est utilisée (option lof: true dans l’entête), une légende courte est nécessaire en plus de la légende complète. Elle est déclarée dans fig.scap. Les figures qui ne sont pas créées par R mais proviennent de fichiers sont intégrées dans un bout de code par la fonction include_graphics() dont l’argument est le fichier contenant l’image à afficher. Placer systématiquement ces fichiers dans le dossier images pour une bonne organisation. 4.3.1.3 Tableaux Les séparateurs horizontaux - et verticaux | permettent de dessiner un tableau selon la syntaxe de Markdown, mais ce n’est pas la meilleure méthode. Les tableaux peuvent aussi être produits par du code R. Le contenu du tableau est dans un dataframe. La fonction kable du package knitr prépare le tableau pour l’affichage et passe le résultat à la fonction kable_styling du package kableExtra pour le formatage final. library("tidyverse") mes_iris <- head(iris) names(mes_iris) <- c("Longueur sépales ($l_s$)", "Largeur", "Longueur pétales", "Largeur", "Espèce") knitr::kable(mes_iris, caption = "Tableau créé par kable", booktabs = TRUE, escape = FALSE) %>% kableExtra::kable_styling(bootstrap_options = "striped", full_width = FALSE) Table 4.1: Tableau créé par kable Longueur sépales (\\(l_s\\)) Largeur Longueur pétales Largeur Espèce 5.1 3.5 1.4 0.2 setosa 4.9 3.0 1.4 0.2 setosa 4.7 3.2 1.3 0.2 setosa 4.6 3.1 1.5 0.2 setosa 5.0 3.6 1.4 0.2 setosa 5.4 3.9 1.7 0.4 setosa La légende est précisée par l’argument caption et le référencement est possible parce que le tableau reçoit une étiquette dont le nom est tab: suivi du nom du bout de code (tableau 4.1). Comme pour les figures, une légende améliorée peut être écrite dans un paragraphe séparé. Une légende courte pour une éventuelle liste des tableaux (option lot: true dans l’entête) est déclarée dans l’argument caption.short de kable(). Utiliser systématiquement l’argument booktabs = TRUE pour que l’épaisseur des lignes de séparation soit optimale en LaTeX. Comme le tableau contient des mathématiques (dans le nom de la première colonne), l’option escape = FALSE est nécessaire. L’option de style bootstrap_options = \"striped\" fournit des tableaux plus lisibles en HTML. Enfin, l’option full_width = FALSE permet d’ajuster la largeur du tableau à son contenu au lieu d’occuper toute la largeur disponible. Le package flextable permet de réaliser des tableaux plus élaborés, comme dans l’exemple suivant qui affiche en couleur les longs sépales. library("flextable") ## ## Attaching package: 'flextable' ## The following objects are masked from 'package:spatstat.geom': ## ## border, rotate ## The following object is masked from 'package:purrr': ## ## compose ## The following objects are masked from 'package:kableExtra': ## ## as_image, footnote # Rappel du jeu de données initial iris iris %>% # Premières lignes head() %>% # Création d'un objet flextable flextable() %>% # Titre des colonnes set_header_labels(Sepal.Length = "Longueur sépales", Sepal.Width = "Largeur", Petal.Length = "Longueur pétales", Petal.Width = "Largeur", Species = "Espèce") %>% # Sélection des longs sépales (>5) et affichage en # rouge color(~Sepal.Length > 5, ~Sepal.Length, color = "red") .tabwid table{ border-spacing:0px !important; border-collapse:collapse; line-height:1; margin-left:auto; margin-right:auto; border-width: 0; display: table; margin-top: 1.275em; margin-bottom: 1.275em; border-color: transparent; } .tabwid_left table{ margin-left:0; } .tabwid_right table{ margin-right:0; } .tabwid td { padding: 0; } .tabwid a { text-decoration: none; } .tabwid thead { background-color: transparent; } .tabwid tfoot { background-color: transparent; } .tabwid table tr { background-color: transparent; } .cl-ca6ed3c6{}.cl-ca6453c4{font-family:'Helvetica';font-size:11pt;font-weight:normal;font-style:normal;text-decoration:none;color:rgba(0, 0, 0, 1.00);background-color:transparent;}.cl-ca645400{font-family:'Helvetica';font-size:11pt;font-weight:normal;font-style:normal;text-decoration:none;color:rgba(255, 0, 0, 1.00);background-color:transparent;}.cl-ca6476d8{margin:0;text-align:right;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:5pt;padding-top:5pt;padding-left:5pt;padding-right:5pt;line-height: 1;background-color:transparent;}.cl-ca6476e2{margin:0;text-align:left;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:5pt;padding-top:5pt;padding-left:5pt;padding-right:5pt;line-height: 1;background-color:transparent;}.cl-ca667910{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-ca667938{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-ca667942{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 2pt solid rgba(102, 102, 102, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-ca667943{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 2pt solid rgba(102, 102, 102, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-ca66794c{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 2pt solid rgba(102, 102, 102, 1.00);border-top: 2pt solid rgba(102, 102, 102, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-ca66794d{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 2pt solid rgba(102, 102, 102, 1.00);border-top: 2pt solid rgba(102, 102, 102, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;} Longueur sépalesLargeurLongueur pétalesLargeurEspèce5.13.51.40.2setosa4.93.01.40.2setosa4.73.21.30.2setosa4.63.11.50.2setosa5.03.61.40.2setosa5.43.91.70.4setosa La documentation du package56 est disponible en ligne, ainsi qu’une galerie57. flextable ne supporte pas la numérotation des légendes hormis dans les documents Word. Cette limite est rédhibitoire. 4.3.1.4 Maths Les équations au format LaTeX peuvent être insérées en ligne, comme \\(A=\\pi r^2\\) (code: $A=\\pi r^2$) ou isolées (les $ sont doublés) comme \\[e^{i \\pi} = -1.\\] Elles peuvent être numérotées: voir équation (4.1), en utilisant l’environnement \\equation. \\[\\begin{equation} A = \\pi r^2. \\tag{4.1} \\end{equation}\\] L’équation numérotée est créée par le code suivant: \\begin{equation} A = \\pi r^2. (\\#eq:disque) \\end{equation} 4.3.1.5 Références croisées Les figures et tableaux ont une étiquette générée automatiquement, identique au nom du bout de code préfixé par fig: et tab:. Pour les équations, l’étiquette est ajoutée manuellement par le code (\\#eq:xxx) avant la fin de l’équation. Les sections peuvent recevoir une étiquette en terminant leur titre par {#yyy}. Les sections reçoivent par défaut une étiquette implicite58 correspondant à leur texte, en minuscules, où les caractères spéciaux sont remplacés par des tirets. Les étiquettes implicites sont instables (elles changent avec le titre de la section) et difficiles à prévoir: c’est pourquoi il est conseillé d’ajouter une étiquette explicite à chaque section faisant l’objet d’un renvoi. C’est le cas des chapitres, pour lesquels le nom du fichier HMTL produit est identique à l’étiquette. Les étiquettes de chapitres doivent respecter les règles de nomenclature des fichiers en ne contenant pas de caractères spéciaux. Des signets peuvent aussi être placés librement dans le texte avec la commande (ref:zzz). Dans tous les cas, l’appel à la référence est fait par la commande \\@ref(ref:zzz). 4.3.1.6 Bibliographie Les références bibliographiques au format bibtex doivent être incluses dans le fichier .bib déclaré dans l’entête du document Markdown. bibliography: references.bib Ce fichier peut être créé et maintenu à jour par Zotero installé avec l’extension Better BibTeX (voir section 1.6). Il suffit pour cela de créer une collection Zotero correspondant au projet et d’y glisser les références pertinentes. Utiliser ensuite le menu contextuel “Exporter la collection…” et sélectionner: Format: “Better BibTeX” pour les articles et présentations ou “Better BibLaTeX” pour les mémoires, selon que la bibliographie est gérée par bibtex et natbib ou biber et biblatex pour la production de documents PDF. Cocher la case “Garder à jour” pour que toute modification dans Zotero soit exportée automatiquement. Cliquer sur “OK” puis choisir le nom du fichier (references.bib) et son emplacement (le dossier du projet R). Les références peuvent être appelées dans le texte, entre parenthèses par le code [@Reference], ou dans le texte, en supprimant les crochets. La bibliographie est traitée par pandoc lors de la production de documents Word ou HTML. Le style bibliographique peut être précisé, en ajoutant la ligne csl:nom_du_fichier.csl dans l’entête du document et en copiant le fichier de style .csl dans le dossier du projet. Plus d’un millier de styles sont disponibles59. Pour les documents PDF, la bibliographie est gérée par LaTeX. Pour préparer la soumission d’un manuscrit à une revue, il faudra ouvrir le fichier .tex intermédiaire produit par pandoc et copier le contenu de l’environnement {document} dans le modèle proposé par la revue, qui se chargera du formatage. 4.3.1.7 Langues Les langues sont à déclarer dans l’entête des document produits par les modèles de memoiR. La langue principale du document modifie le nom de certains éléments, comme la table des matières. Les langues supplémentaires permettent la rédaction de documents multilingues. Les champs de l’entête sont: lang: fr-FR otherlangs: [en-US, it] Le changement de langue dans le document est géré en LaTeX mais pas en HTML en insérant sur une nouvelle ligne la commande suivante : \\selectlanguage{english} La langue en cours n’a d’effet que dans les sorties LaTeX: un espace est ajouté devant les ponctuations doubles en Français, la taille des espaces est plus grande en début de phrase en Anglais, etc. La commande \\selectlanguage est simplement ignorée en HTML. Les noms de langues sont différents dans l’entête (codes IETF) et dans le texte (nom de la langue). La correspondance et la liste complète des langues se trouve dans le tableau 3 de la documentation du package polyglossia60. 4.3.2 Modèle Simple Article Le modèle Simple Article de memoiR produit un document HTML simple avec une table des matières flottante (voir l’exemple61). D’autres formats HTML sont disponibles: voir la gallerie62 du package. Le format PDF est proche du modèle article de LaTeX (exemple63). Le modèle contient sa propre documentation. 4.3.2.1 Créer Utiliser le menu “File > New File > R Markdown…” puis sélectionner “From template” (figure 4.1). La liste des modèles disponible et le package qui les propose est alors affichée. Sélectionner le modèle Simple Article du package memoiR, choisir le nom du projet (“Name:”, qui sera le nom du dossier dans lequel il sera créé, et son dossier parent (“Location:”). Dans l’organisation proposée en section 1.2.4, le dossier parent est %LOCALAPPDATA%\\ProjetsR. Le nom du projet ne doit contenir aucun caractère spécial (accent, espace…) pour assurer sa portabilité sur tous les systèmes d’exploitation (Windows, Linux, MacOS). Les modèles élaborés créent un dossier avec de nombreux fichiers (bibliographie, styles, modèle LaTeX…), contrairement aux modèles simples qui créent seulement un fichier. Quand un dossier est créé, par exemple par le modèle Simple Article, il faut en faire un projet RStudio: dans le menu des projets (en haut à droite de la fenêtre de RStudio), utiliser le menu “New Project…” puis “Existing Directory” et sélectionner le dossier qui vient d’être créé. 4.3.2.2 Ecrire Les instructions pour utiliser le modèle sont contenues dans le texte fourni par défaut. 4.3.2.3 Tricoter Le document peut être tricoté en plusieurs formats: html_document2 est le format HTML pour lequel le modèle a été conçu: un bloc-note avec une table des matières flottante; gitbook est un format HTML alternatif, utilisé normalement pour les ouvrages; downcute est un format HTML proposé par le package rmdformats; pdf_book produit un document PDF suivant le modèle LaTeX article, couramment utilisé directement en LaTeX; word_document2 crée un ficher Word. 4.3.2.4 Mettre en ligne Le package memoiR simplifie la mise en ligne des documents produits. La fonction build_gitignore() crée un fichier .gitignore pour le contrôle de source qui doit être activé (voir section 3.1.1). La fonction build_readme() crée un fichier README.md nécessaire à GitHub. Il contient le titre du projet, son résumé et des liens vers les versions HTML et PDF des documents produits. Le projet doit être lié à un dépôt GitHub (section 3.2). Deux stratégies de publications sont possible. Dans la première, les documents sont tricotés localement et placés dans le dossier docs, qui sera le support des pages GitHub. Dans la seconde, les documents sont tricotés par GitHub Actions à chaque fois que des modifications sont poussées sur le dépôt: on parle d’intégration continue (section 6). La stratégie de production locale est traitée ici; l’intégration continue le sera dans la section 6.3.1. La fonction build_githubpages() place tous les documents tricotés (HTML et PDF) dans le dossier docs, avec une copie du fichier README.md. De cette façon, il est possible d’activer les pages GitHub du projet (sur le dossier docs de la branche master). Le fichier README.md sera la page d’accueil du site web produit. En pratique, on tricote au format HTML pendant toute la phase de rédaction, parce que la production est très rapide. Quand le document est stabilisé, il faut le tricoter au format HTML et au format PDF. Enfin, l’exécution de build_githubpages() place tous les fichiers produits dans docs. Il reste à pousser le dépôt sur GitHub et activer les pages GitHub. 4.3.3 Autres modèles Le modèle Stylish Article de memoiR est destiné à la production d’articles PDF pour l’autoarchivage (typiquement, le dépôt sur HAL) bien formatés, au format A4 en double colonne64. Le format HTML est le même que celui du modèle Simple Article. Le package rticles a pour ambition de fournir des modèles pour toutes les revues scientifiques qui acceptent une soumission d’articles en LaTeX. Il propose donc des modèles Markdown qui produisent des fichiers PDF conformes aux exigences des revues et la possibilité de récupérer le fichier .tex intermédiaire (pandoc produit un fichier .tex transmis au compilateur LaTeX). Le package ne permet pas de tricot HTML parce qu’il utilise la syntaxe LaTeX dans le document R Markdown au lieu d’utiliser bookdown pour gérer les références bibliographique et les références croisées. Il n’est pas possible d’échanger directement du contenu R Markdown standard avec des documents écrits pour rticles, ce qui limite beaucoup l’intérêt du package. 4.4 Présentation Beamer Le modèle Beamer Presentation de memoiR permet de créer des présentations au format HTML et PDF (beamer) simultanément, comme le montre l’exemple65. La démarche est identique à celle des articles du même package. Les niveaux de titre permettent de séparer les parties de la présentation (#) et les diapositives (##). Deux formats sont disponibles en HTML: ioslides66 et Slidy67. Quelques spécificités dans le code permettent d’affiner la présentation des diapositives, pour un affichage sur deux colonnes par exemple: elles sont documentées dans le modèle. 4.5 memoir Le modèle Memoir du package memoiR est destiné aux documents longs, qui présentent une différence importante avec les documents précédents: un document long est composé de plusieurs chapitres, chacun placé dans son fichier .Rmd. Le format HTML est gitbook68, le standard de la lecture en ligne de documents de ce type. Le format PDF est dérivé du modèle LaTeX memoir69, optimisé aussi pour les documents longs. Ce document a été écrit avec ce modèle. 4.5.1 Créer La création d’un projet d’ouvrage est identique à celle présentée plus haut: le modèle est: Memoir. Le dossier créé doit être transformé en projet. Exécuter build_git() et build_readme(), activer le contrôle de source et pousser le projet sur GitHub, de la même façon que pour un article (section 4.3.2.4). Chaque chapitre de l’ouvrage est un fichier Rmd, dont le nom commence normalement par son numéro (ex.: 01-intro.Rmd). Tous les fichiers Rmd présents dans le dossier du projet sont en réalité traités comme des chapitres, triés par ordre de nom de fichier, dont ceux fournis par le modèle (démarrage et syntaxe) qui doivent être supprimés à l’exception de 99-references.Rmd qui contient la bibliographie, placée à la fin. Le fichier index.Rmd est particulier: il contient l’entête du document et le premier chapitre. 4.5.2 Ecrire Le premier chapitre est placé dans l’avant-propos de l’ouvrage imprimé: il ne doit pas être numéroté (d’où le code {-} à côté du titre) dans la version HTML. Il se termine obligatoirement par la commande LaTeX \\mainmatter qui marque le début du corps de l’ouvrage. Les niveaux de plan commencent par # pour les chapitres (un seul par fichier), ## pour les sections, etc. 4.5.3 Tricoter La compilation au format PDF est faite par XeLaTeX, qui doit être installé. Pendant la rédaction, il est fortement conseillé de ne créer que le fichier HTML, ce qui est beaucoup plus rapide qu’une compilation LaTeX. Chaque chapitre peut être visualisé très rapidement en cliquant sur le bouton “Knit” au-dessus de la fenêtre de source. Le livre entier est créé en cliquant sur le bouton “Build Book” de la fenêtre Build de RStudio. La liste déroulante du bouton permet de créer tous les documents ou de se limiter à un format. Les fichiers produits sont placés directement dans le dossier docs, qui sera utilisé par les pages GitHub pour permettre la lecture en ligne et le téléchargement du PDF. La page d’accueil du site web est créée par bookdown à partir du fichier index.Rmd: le fichier README.md n’est pas dupliqué dans docs. 4.5.4 Finitions La mise en page est assurée de façon totalement automatique par pandoc (en HTML) et LaTeX (en PDF). Il est souvent utile d’aider LaTeX à résoudre quelques dépassements de marge dus à de trop grandes contraintes de mise en page: pour la lisibilité optimale, les colonnes sont étroites, mais le code (texte formaté entre deux apostrophes inversées) n’autorise pas la césure. Si une ligne de texte dépasse dans la marge de droite dans le document PDF, la solution consiste à ajouter manuellement le code \\break à l’emplacement désiré pour le retour à la ligne dans le document R Markdown. La commande n’a aucun effet sur le document HTML mais force la césure en LaTeX. Pour couper du texte formaté (entre astérisques pour l’italique ou plus fréquemment entre apostrophes inversées pour du code), il faut terminer le formatage avant \\break et le recommencer après. Exemple, pour forcer le retour à la ligne avant fichier.Rmd: Le fichier `/chemin/`\\break`fichier.Rmd` En HTML, un espace sera ajouté entre les deux portions de code. Les bouts de code R sont formatés automatiquement par knitr quand l’option tidy=TRUE leur est appliquée. Le comportement par défaut est indiqué dans les options de knitr, dans un bout de code au début du fichier index.Rmd: # knitr options knitr::opts_chunk$set( cache=TRUE, warning=FALSE, echo = TRUE, fig.env='SCfigure', fig.asp=.75, fig.align='center', out.width='80%', tidy=TRUE, tidy.opts=list(blank=FALSE, width.cutoff=55), size="scriptsize", knitr.graphics.auto_pdf = TRUE) La largeur maximale d’une ligne de code formaté est ici de 55 caractères, optimal pour le modèle. Il arrive que le formatage automatique ne fonctionne pas parce que knitr ne parvient pas à trouver une coupure de ligne respectant toutes les contraintes, ce qui provoque un dépassement de marge dans le code. Dans ce cas, formater manuellement le bout de code en lui ajoutant l’option tidy=FALSE. Les blocs de code littéral, délimités par trois apostrophes inversées, doivent être formatés manuellement, en évitant toute ligne de plus de 55 caractères. 4.5.5 Site gitbook Le site web contenant le document gitbook doit être paramétré dans _output.yml pour que : Le titre du document apparaisse en haut de la table des matières; Une indication de l’usage de GitHub et bookdown soit affichée en bas de la table des matières; Un bouton GitHub dans la barre de titre permette d’ouvrir le dépôt du projet; Un autre bouton permette de télécharger le document PDF. Le fichier _output.yml de ce document est le suivant: bookdown::gitbook: css: style.css config: sharing: github: yes facebook: false twitter: false toc: before: | <li><a href="./">Travailler avec R</a></li> after: | <li> <a href="https://github.com/EricMarcon/travailleR" target="blank"> Hébergé sur GitHub, publié par bookdown </a> </li> download: pdf La section sharing: gère les boutons de la barre de titre. Par défaut, les liens vers Facebook et Twitter sont activés mais celui vers GitHub ne l’est pas. Pour qu’il fonctionne, le dépôt GitHub doit être déclaré dans l’entête du fichier index.rmd: github-repo: EricMarcon/travailleR La section toc: contient deux portions de code HTML dans lesquelles le titre du document et le lien vers son dépôt GitHub doivent être adaptés au projet. Enfin, la section download: liste les formats de documents téléchargeables et permet d’afficher un bouton de téléchargement dans la barre de titre. 4.5.6 Intégration continue La construction d’un ouvrage prend du temps, surtout s’il contient des calculs. Elle doit être lancée au format gitbook et au format PDF. En production, elle peut être confiée à GitHub (chapitre 6.3.2). 4.5.7 Google Analytics Le suivi de l’audience de l’ouvrage peut être confié à Google Analytics. Pour cela, il faut créer un compte et ajouter une propriété Google Analytics, c’est-à-dire un site web, puis un flux de données, ici un flux web70. Google Analytics fournit un script de configuration nommé gtag.js à placer à la racine du dossier du projet. Enfin, déclarer le script dans l’entête des pages web en ajoutant une instruction dans _output.yml, dans sa première section. bookdown::gitbook: includes: in_header: gtag.js 4.6 Site web R Markdown Un site web constitué de pages écrites avec R Markdown (sans les fonctionnalités de bookdown) et un menu peut être créé très simplement, avec un résultat de bonne facture71. 4.6.1 Modèle Dans RStudio, dans le menu des projets en haut à droite, cliquer sur “New Project…” puis “New Directory” puis “Simple R Markdown website”. Saisir le nom du projet, sélectionner le dossier dans lequel le projet sera créé en cliquant sur “Browse” et enfin cliquer sur “Create Project”. Le site par défaut contient deux pages: index, la page d’accueil, et about, la page “A propos”. Le fichier _site.yml contient le nom du site et le contenu de sa barre de navigation: un titre et le fichier correspondant. D’autres pages seront ajoutées en créant de nouveaux fichiers .Rmd et en les ajoutant au fichier _site.yml. 4.6.2 Améliorations Le modèle de site peut facilement être amélioré en complétant _site.yml: en ajoutant une icône GitHub dans la barre de navigation pour renvoyer vers le code source du site: en choisissant la méthode de tricot des pages, pour utiliser bookdown au lieu de rmarkdown; en plaçant les fichiers du site dans le dossier docs et ainsi séparer le code et la production. Le fichier _site.yml complété est le suivant: name: "my-website" navbar: title: "My Website" left: - text: "Home" href: index.html - text: "About" href: about.html right: - icon: fa-github href: https://github.com/rstudio/rmarkdown output_dir: "docs" output: bookdown::html_document2: theme: sandstone highlight: tango toc: true toc_float: yes L’icône de GitHub fait partie de la collection Font Awesome dont toutes les icônes gratuites72 sont utilisables avec la même syntaxe: “fa-nom”. Le lien correspondant à l’icône doit être celui du dépôt GitHub du site web. La syntaxe de la section output est la même que celle des documents vus plus haut. Elle s’applique à toutes les pages (dont l’entête YAML est réduite au minimum). Les thèmes disponibles sont ceux de rmarkdown73. L’option highlight indique la façon dont le code R éventuellement affiché sera formaté. Enfin, la table des matières est flottante, ce qui signifie que sa position s’ajuste quand la fenêtre défile. 4.6.3 Contôle de source Le projet doit être placé sous contrôle de source et poussé sur GitHub (chapitre 3). Le fichier .gitignore est le suivant: # R .Rbuildignore .RData .Rhistory .Rprofile .Rproj.user # Web Site /_site/ /*_cache/ /*_files/ Activer les pages GitHub (section 3.6) sur le dossier docs pour héberger le site. Ajouter un fichier vide nommé .nojekyll dans docs pour que les pages GitHub ne tentent pas de reformater le site. On peut utiliser le terminal de RStudio pour exécuter: touch docs/.nojekyll 4.7 Site web personnel : blogdown Pour créer une page web personnelle, Hugo est un générateur de site statique capable de produire des pages HTML à partir de code Markdown. Les sites statiques ont l’avantage, en comparaison aux sites dynamiques gérés par un système de gestion de contenu (CMS, par exemple: Wordpress, Joomla, SPIP), d’être portables sur n’importe quel serveur web sans support de base de données ni de code à exécuter côté le serveur (tel que PHP) et d’être très rapides puisque les pages sont créées une seule fois et non à chaque consultation. Un site Hugo peut être hébergé par exemple sur la page personnelle de tout utilisateur de GitHub dont l’adresse est de la forme “NomUtilisateur.github.io”. Hugo propose de nombreux thèmes, qui sont des modèles de structure de sites, donc le thème Academic, destiné aux chercheurs. Dans RStudio, le package blogdown est prévu pour produire facilement des pages web avec Hugo. Ces pages peuvent contenir du code R: elles sont très proches d’un article, vu plus haut, dont le contenu peut être facilement copié et collé. Nous utiliserons donc cette solution, pour un site comme celui proposé en exemple74. La structure du site web est simple: une page d’accueil, contenant divers composants paramétrables comme la biographie de l’auteur, une sélection de publications, de billets de blogs ou d’autres éléments et un formulaire de contact; des pages détaillant les divers éléments (publications, billets, etc.) écrites en R Markdown. 4.7.1 Installation des outils La première étape consiste à installer le package blogdown dans R. install.packages("blogdown") blogdown est capable d’installer Hugo sous Windows, macOS ou Linux. blogdown::install_hugo() La documentation complète de blogdown est disponible75. Les versions récentes de Hugo utilisent Go (le langage de programmation) pour installer leurs modules à la volée: ici le thème Academic est chargé depuis GitHub au moment de la création du site. Go doit donc être installé76. 4.7.2 Créer La façon la plus simple consiste à créer un dépôt sur GitHub à partir du modèle. Sur la page du dépôt starter-academic77, cliquer sur le bouton “Use this template”, s’authentifier éventuellement sur GitHub, puis saisir le nom du dépôt qui contiendra le projet, par exemple “MySite”. Le dépôt peut être celui du site principal de son compte GitHub (voir section 3.6), à l’adresse https://GitHubID.github.io78. Le nom à saisir est simplement “GitHubID.github.io” (GitHubID est le nom du compte GitHub). Créer le dépôt. Copier l’adresse du dépôt en cliquant sur le bouton “Code” puis sur le bouton à droite de l’adresse (figure 4.4). Figure 4.4: Copie de l’adresse d’un dépôt à cloner sur GitHub. Dans RStudio, créer un nouveau projet à partir de GitHub: dans le menu des projets en haut à droite, cliquer sur “New Project…” puis “Version Control” puis “Git” puis coller l’adresse dans le champ “Repository URL” (figure 4.5). Sélectionner le dossier dans lequel le projet sera créé en cliquant sur “Browse” et enfin cliquer sur “Create Project”. Figure 4.5: Collage de l’adresse du dépôt à cloner. Le projet créé est une copie exacte du modèle, qui doit être personnalisée. RStudio ajoute automatiquement à la fin du fichier .gitignore une ligne pour ignorer ses fichiers de travail (dossier .Rproj.user). Ajouter une ligne de commentaire pour le signaler. Le contenu de .gitignore doit être le suivant: # R .Rbuildignore .RData .Rhistory .Rprofile .Rproj.user # Hugo /resources/ /public/ # blogdown /static/en/ /static/fr/ *.rmarkdown _index.html index.html **/index_files/ Un bug de blogdown nécessite de déplacer le fichier config.toml du dossier config/_default/ à la racine du projet. Prendre en compte ces modification dans git en faisant un commit. 4.7.3 Site personnel sur GitHub Si le site doit être le site principal de son compte GitHub (voir section 3.6), son code doit être placé dans une autre branche que master, qui est destinée à l’affichage des pages produites. Quelques manipulations supplémentaires sont nécessaires à ce stade. La première consiste à créer une branche source pour le code (voir section 3.4). Exécuter dans le terminal de RStudio: git branch source git checkout source Si l’interface graphique de RStudio ne reflète pas le changement de branche, il faut quitter et relancer l’application. A partir de cette étape, tous les développements auront lieu dans la branche source. Elle n’a pas pour objectif d’être fusionnée avec la branche master. 4.7.4 Construction du site Exécuter blogdown::build_site(build_rmd = TRUE) pour construire le site web, y compris ses futures pages R Markdown. Pour afficher le site, exécuter : blogdown:::serve_site() Il apparaît dans la fenêtre Viewer de RStudio, dont le bouton d’agrandissement permet l’affichage dans le navigateur internet par défaut du système. Pour modifier le contenu du site, il est préférable d’arrêter le serveur web par la commande: blogdown:::stop_server() Le site produit par blogdown se trouve dans le dossier public qui peut être copié directement sur un serveur web qui l’hébergera. Une solution simple pour un site autre que le site principal du dépôt GitHub consiste à déclarer ce dossier comme racine des pages GitHub du projet (section 3.6). Pour le site principal, le contenu de public doit être copié à la racine de la branche master. Cette opération sera réalisée par intégration continue: voir section 6.3.4. Pour le faire manuellement, suivre les étapes suivantes: afficher la branche master. Le répertoire public est ignoré par gitignore donc il n’est pas modifié; dans la branche master, supprimer tout le contenu original devenu inutile puisque le code est traité dans la branche source. Conserver les fichiers et dossiers commençant par un point (paramètres de git, GitHub et RStudio), les dossiers ignorés (public, ressources et static) et supprimer le reste; déplacer le contenu de public vers la racine du projet; valider par un commit; pousser le projet sur GitHub; vérifier le bon affichage du site sur https://GitHubID.github.io. 4.7.5 Site multilingue Si le site est multilingue (Français et Anglais par exemple), son contenu (dossier content) doit être copié dans un dossier correspondant à chaque langue. Par exemple, le fichier content/authors/admin/_index.md qui contient les informations sur le propriétaire du site est remplacé par content/en/authors/admin/_index.md et content/fr/authors/admin/_index.md si le site supporte l’Anglais et le Français. En pratique, créer un dossier en et un dossier fr dans content. Copier tout le contenu de content (sauf les deux nouveaux dossiers) dans en puis déplacer ce même contenu dans fr. 4.7.6 Paramétrer Les fichiers de configuration du site sont bien documentés et offrent de nombreuses options. Les principales sont passées en revue ici pour une création rapide d’un site fonctionnel. Le fichier config.toml contient les paramètres généraux du site. Les lignes à mettre à jour sont celle du titre du site (le nom du propriétaire puisqu’il s’agit d’un site personnel) et son adresse publique. Pour le site exemple : title = "Eric Marcon" baseurl = "https://EricMarcon.github.io/" Il contient aussi la ligne de sélection de la langue par défaut (“en” ou “fr” au choix) et celle qui permet de placer les fichiers produits par Hugo dans chaque dossier de langue (“true” obligatoirement pour un site multilingue): defaultContentLanguage = "fr" defaultContentLanguageInSubdir = true Le dossier config/_default/ contient les autres fichiers de configuration. languages.toml contient les paramètres linguistiques et les traductions de menus. Pour chaque langue, la version utilisée et le dossier de contenu sont précisés: [en] languageCode = "en-us" contentDir = "content/en" [fr] languageCode = "fr-fr" contentDir = "content/fr" Pour les langues additionnelles, le titre du site, les paramètres d’affichage des dates et la traduction des menus sont ajoutés. Dans la section [fr]: [fr] languageCode = "fr-fr" contentDir = "content/fr" title = "Eric Marcon" description = "Page personnelle d'Eric Marcon" [fr.params] description = "" date_format = "02-Jan-2006" time_format = "15:04" [[fr.menu.main]] name = "Accueil" url = "#about" weight = 20 (...) Ces lignes sont commentées dans le modèle et doivent dont être décommentées en retirant les # en têtes de lignes. Les menus sont décrits plus bas. params.toml décrit l’aspect du site. Les options sont regroupées par sujet, par exemple “Theme” pour l’apparence générale. Dans “Basic Info”, la ligne site_type = "Person" sélectionne un site personnel. Il est possible d’utiliser Academic pour un site de projet scientifique ou un site d’unité, non documentés en détail ici. Les principales différences sont, pour un site collectif: la gestion des auteurs: dans le dossier /contents/<langue>/authors, un seul dossier admin est utilisé pour un site personnel alors qu’un dossier par personne est nécessaire pour un site collectif; un composant décrit plus bas, qui permet de présenter les personnes, doit être activé. La description du site dans la langue par défaut est saisie, à destination des moteurs de recherche: description = "Eric Marcon's Homepage" Elle doit être traduite dans le fichier languages.toml, dans chaque langue. Dans “Site Features”, nous sélectionnons la coloration du code R, l’activation du formatage des équations et l’avertissement légal pour l’utilisation des cookies. highlight_languages = ["r"] math = true privacy_pack = true La ligne edit_page doit être mise à jour: remplacer le dépôt par défaut “https://github.com/gcushen/hugo-academic” par celui du site. “Contact details” contient les informations pour contacter le propriétaire du site. Elles doivent être saisies. “Regional Settings” contient les paramètres d’affichage de date pour la langue par défaut (ceux des autres langues sont dans languages.toml). Ils n’ont normalement pas à être modifiés. “Comments” permet d’activer les commentaires des visiteurs en bas de pages, avec Disqus ou Comment.io (un compte est nécessaire chez le fournisseur). “Marketing” permet d’activer le suivi de fréquentation du site en saisissant simplement son identifiant Google Analytics (à créer avec un compte Google). “Content Management System” contient la ligne netlify_cms dont la valeur doit être false si le site n’est pas hébergé par Netlify. Enfin “Icon Pack Extensions” permet d’activer les icônes Academicons si nécessaire. 4.7.7 Ecrire Utiliser la documentation en ligne79 en complément des informations principales détaillées ici. L’exemple utilisé ici est le site personnel de l’auteur80. La méthode de travail consiste à progresser pas à pas en testant puis validant chaque étape: Effectuer les modifications; Construire le site et vérifier le résultat: blogdown:::serve_site(); Arrêter le site: blogdown::stop_server(); Si le résultat n’est pas satisfaisant, recommencer; Valider les modifications (commit). 4.7.7.1 Page d’accueil La page d’accueil du site est constituée par une suite d’éléments (widgets) qui se trouvent dans /contents/<langue>/home. Chaque élément est décrit par un fichier markdown. Le premier est index.md. Il n’est normalement jamais modifié. Son contenu est le suivant: +++ # Homepage type = "widget_page" headless = true # Homepage is headless, other widget pages are not. +++ Le fichier ne contient qu’un entête au format TOML, encadré par une ligne de +++. Le type de composant (type) indique qu’il s’agit d’une page de composants, dans laquelle les autres composants du dossier trouveront leur place. headless = true signifie que la page n’a pas d’en-tête. Figure 4.6: Composant demo dans Academic. Le composant demo.md (figure 4.6) est un composant de type “blank”, c’est-à-dire une page de texte libre: il sert ici à présenter le modèle Academic Kickstart et doit donc être désactivé. L’entête contient ses informations de formatage (titre, nombre de colonnes, couleurs…) et le contenu de la page est écrit en markdown. Les composants apparaissent par ordre croissant de poids (weight dans l’entête): 15 marque le premier composant dans le modèle Academic. Le composant peut être désactivé en supprimant son fichier ou en modifiant sa propriété active dans l’entête: active = false # Activate this widget? true/false Figure 4.7: Composant about dans Academic. Le composant suivant est about.md (figure 4.7). Il présente le propriétaire du site. Son titre doit être localisé. Dans le dossier /content/fr/home, sa valeur sera: title = "Biographie" L’auteur (author) doit correspondre à un dossier de /contents/<langue>/authors. admin convient parfaitement pour un site personnel. Academic permet de créer des sites d’équipes: dans cette configuration, un dossier par personne serait nécessaire. L’image affichée par le composant est le fichier avatar.jpg placé dans ce dossier. Limiter la taille du fichier pour la performance du site (moins d’un mégaoctet est une taille raisonnable), tout en assurant une taille minimale de quelques centaines de pixels de côté pour la qualité de l’affichage. Le contenu du composant est lu dans le fichier _index.md du même dossier, qui contient toutes les informations sur l’auteur. Son organisation est assez claire: modifier son contenu à partir de l’exemple fourni. Si des icônes de type ai sont utilisées, activer le pack d’icône Academicons dans config/_default/params.toml. Figure 4.8: Composant skills dans Academic. Le composant talents (skills, figure 4.8) présente les compétences de l’auteur de façon graphique. Une collection d’icônes est disponible, et des icônes nouvelles peuvent être ajoutées. Figure 4.9: Composant experience dans Academic. Le composant expérience (experience, figure 4.9) liste les expériences professionnelles. Toutes les informations sont saisies dans son entête. Le composant accomplishments présente les formations professionnelles et permet d’accéder à leurs certificats. Le composant posts va chercher son contenu dans le dossier /contents/<langue>/post qui contient les billets de blog (voir plus bas). Le fichier posts.md contient des options de mise en page dans son entête. Le composant projects fonctionne de la même façon. La différence entre les deux composants est leur mise en forme: posts est du type “pages”, qui affiche les éléments les plus récents, alors que projects est de type “portfolio”, qui affiche les éléments sélectionnés qui contiennent la description featured: true dans leur propre entête. Il est possible de créer des composants de ces types librement, en spécifiant le dossier contenant les éléments dans “page-type”. Exemple: créer un composant nommé software.md en renommant projects.md, modifier sa ligne page_type = \"software\" et créer un dossier /contents/<langue>/software pour y placer du contenu. Les composants publications et featured sont de type “pages” et “portfolio” respectivement et prennent leur contenu dans le dossier publication. Le composant tags présente un nuage de mots à partir des mots-clés déclarés dans tous les fichiers de contenu (billets de blog, publications…) sous la forme suivante dans leur entête: tags = ["Mot Clé 1", "Autre Mot Clé"] Enfin, le composant contact permet d’afficher un formulaire de contact. Il utilise les informations du fichier config/_default/params.toml dans sa partie commençant par: ############################ ## Contact details ## Pour afficher une carte, entrer la latitude et la longitude de l’adresse dans la ligne coordinates. Pour afficher un formulaire de messagerie, choisir le service formspree.io (email_form = 2 dans contact.md). Pour activer le service de messagerie, il faudra construire le site web, s’envoyer un premier message en utilisant le formulaire et suivre les instructions de Formspree. Le composant people est utilisé dans les sites collectifs pour présenter les membres. Le composant slider permet d’afficher un carrousel (des éléments défilants) en haut de page. Pour comprendre son fonctionnement, le plus simple consiste à l’activer. 4.7.7.2 Menu de la page d’accueil La page d’accueil comporte un menu qui permet de naviguer rapidement vers ses composants ou vers d’autres pages. Il est paramétré dans config/_default/menus.toml. Les éléments du menu ont un nom affiché, un lien (commençant par # pour pointer vers un composant ou un chemin relatif dans le site comme publication/), et un poids qui définit leur ordre d’affichage, de la même façon que celui des composants de la page d’accueil. Un menu à deux éléments pour pointer vers l’accueil du site et les billets de blogs est donc le suivant: [[main]] name = "Home" url = "#about" weight = 10 [[main]] name = "Posts" url = "#posts" weight = 20 Le menu doit être traduit dans chaque langue dans le fichier config/_default/languages.toml: [fr] [[fr.menu.main]] name = "Accueil" url = "#about" weight = 10 [[fr.menu.main]] name = "Articles" url = "#posts" weight = 20 4.7.7.3 Billets Le site est alimenté par des billets de blog placés dans le dossier /contents/<langue>/post. Il doivent être traduits et placés dans le dossier post de chaque langue pour être disponibles dans la langue correspondante. L’exemple utilisé ici est un guide pour estimer correctement la densité d’une variable bornée81. Son code est sur GitHub82. Un billet est placé dans un dossier (/content/fr/post/densite) qui contient son code R Markdown et éventuellement des images, des données pour alimenter le code et d’autres éléments appelés par le code. Hugo supporte des fichiers markdown natifs. L’apport de blogdown relativement à un site Hugo natif est le support de R Markdown, donc la possibilité d’exécuter tout code R comme dans un bloc-note (dont le contenu peut être réutilisé sans modification). Le fichier principal d’un billet est index.Rmd. blogdown crée un fichier index.html pendant la construction du site: il peut être ignoré (dans .gitgnore) et supprimé à tout moment. Si une image featured.png (optimale pour un schéma) ou featured.jpg (optimale pour un photo) est placée dans le dossier, elle sera utilisée comme vignette du billet. index.Rmd comprend un entête au format yaml (entourée par des ---) ou toml (entourée par des +++) qui décrit son affichage: --- title: "Titre du billet" subtitle: "Sous-titre" summary: "Résumé" authors: [] tags: ["Mot Clé 1", "Autre Mot Clé"] categories: [] date: 2020-04-17 featured: false draft: false # Featured image # To use, add an image named `featured.jpg/png` to # your page's folder. # Focal points: Smart, Center, TopLeft, Top, TopRight, # Left, Right, BottomLeft, Bottom, BottomRight. image: caption: "" focal_point: "" preview_only: false bibliography: references.bib --- Les auteurs sont utilisés dans les sites collectifs. Les tags permettent d’alimenter le composant nuage de mots s’il est activé dans la page d’accueil. Les catégories permettent de rechercher des pages au contenu similaire (recherche par mot-clé sur le site). L’option featured: true fait apparaître le billet dans les composants de type featured sur la page d’accueil. L’option draft: true cache le billet. Les éléments suivants précisent l’affichage de la vignette: légende et position. L’option preview_only: true limite l’affichage aux miniatures (sur la page d’accueil), retirant donc l’image du billet lui-même. Les éléments d’entête nécessaires au corps de texte R Markdown, comme le nom du fichier contenant les références bibliographiques, placé dans le même dossier, sont ajoutés. Le corps du texte est celui d’un document R Markdown standard, avec du code R inclus. Un bout de code initial permet de fixer les options de R et charger les packages nécessaires. En pratique, la façon la plus efficace de créer un nouveau billet est de copier le dossier complet d’un billet précédent, de le renommer et de modifier son contenu. La commande blogdown::new_post() peut aussi être utilisée mais ne gère pas les langues multiples (et crée donc le billet dans le dossier /contents/post à moins de préciser l’argument subdir). La reconstruction du site ne met par défaut pas à jour les pages basées sur un fichier .Rmd. Pour le faire, il faut forcer la commande build_site(). blogdown::build_site(build_rmd = TRUE) blogdown::serve_site() 4.7.7.4 Publications Les publications sont organisées comme les billets, mais placées dans le dossier /contents/<langue>/publications. L’exemple utilisé est un article de revue83 avec son code84. Un fichier cite.bib contenant la référence au format BibTex est placé dans le dossier. Le nom du dossier est de préférence celui de l’identifiant de la publication. L’entête du fichier index.md (ici au format Markdown, mais .Rmd est possible si du code R est nécessaire) contient les mêmes informations que le fichier BibTex, mais au format approprié (yaml), et les éléments propres à Academic (featured): --- title: "Evaluating the geographic concentration of |> industries using distance-based methods" authors: ["Eric Marcon", "Florence Puech"] publication_types: ["2"] abstract: "We propose (...)" publication: "*Journal of Economic Geography*" doi: "10.1093/jeg/lbg016" date: 2003-10-01 featured: false --- Les types de publication sont: 0 = Uncategorized; 1 = Conference paper; 2 = Journal article; 3 = Preprint / Working Paper; 4 = Report; 5 = Book; 6 = Book section; 7 = Thesis; 8 = Patent. Des boutons sont affichés en haut de la page de la publication en fonction des informations trouvées : PDF: si la ligne url est présente dans l’en-tête; Citation: si le fichier cite.bib est présent dans le dossier; DOI: si la ligne doi est présente dans l’en-tête. Le corps de la publication contient un lien (au format HTML) vers le site Dimension qui fournit des informations bibliométriques. Ce lien peut être réutilisé très simplement, en remplaçant simplement le DOI du document: <span class="__dimensions_badge_embed__" data-doi="10.1093/jeg/lbg016"></span> <script async src="https://badge.dimensions.ai/ badge.js" charset="utf-8"></script> Enfin, un fichier /contents/<langue>/publications/_index.Rmd permet de présenter la bibliographie complète. Il est accessible à partir du composant publications de la page d’accueil qui affiche un lien “Plus de Publications”. Le fichier exemple85 avec son code86 permet d’interroger Google Scholar pour obtenir le réseau de coauteurs, l’indice h et le nombre de citations annuelles de l’auteur. Il est réutilisable en modifiant simplement l’identifiant Google Scholar à la ligne 30. En faisant exécuter le code régulièrement, par exemple par GitHub (voir ci-dessous), les statistiques affichées sont maintenues à jour sans intervention humaine. 4.7.7.5 Communications Les communications sont organisées comme les publications, dans le dossier /contents/<langue>/talk. L’exemple utilisé est une communication en Français, donc dans /contents/fr/talk87 avec son code88. Une image peut être utilisée plus facilement que pour une publication. L’entête contient des lignes particulières adaptées aux communications: --- title: "Construction de l'estimateur de biodiversité |> Chao1" event: "Semaine des mathématiques 2020" event_url: https://eduscol.education.fr/cid59178/|> semaine-des-mathematiques.html location: Université de Guyane summary: [] abstract: | Pour estimer le nombre d’espèces (richesse spécifique) d’une communauté à partir d’un échantillon, l’estimateur Chao1 est l’outil le plus utilisé. Sa construction est expliquée et son efficacité est testée sur des données simulées. # Talk start and end times. # End time can optionally be hidden by # prefixing the line with `#`. date: "2020-03-11T11:00:00Z" date_end: "2020-03-11T12:00:00Z" all_day: false # Schedule page publish date (NOT talk date). publishDate: "2020-04-14" # Is this a featured talk? (true/false) featured: false image: caption: 'Produit scalaire des vecteurs $v_0$ |> et $v_2$' focal_point: Smart url_code: "https://github.com/EricMarcon/Chao1" url_pdf: "https://EricMarcon.github.io/Chao1/|> Chao1.pdf" url_slides: "https://EricMarcon.github.io/Chao1/|> Chao1.html" # Enable math on this page? math: true --- Les liens (url_code par exemple) font apparaître des boutons qui permettent d’afficher respectivement le code source de la présentation, un fichier pdf et les diapositives en ligne. 4.7.7.6 Autres éléments Il est possible d’ajouter librement des éléments supplémentaires sur le site: dans /contents/<langue>/, créer un dossier dont le nom est le type d’éléments (exemple: recette); ajouter des éléments dans ce dossier, chacun dans son propre dossier; le fichier obligatoire est index.md ou index.Rmd avec un en-tête contenant possiblement tous les champs rencontrés dans les éléments post, publication et talk; le fichier de vignette, featured.png ou featured.jpg, est facultatif; tous les fichiers nécessaires au tricot (images, données) peuvent être ajoutés dans le même dossier; dans /contents/<langue>/home, ajouter un composant de la page d’accueil en copiant-collant un élément existant de type “pages” (comme publications) ou “portfolio” (comme featured) et le paramétrer pour qu’il pointe sur le bon dossier (dans l’exemple: page-type=recette) et ajuster son apparence (nombre d’éléments par exemple) et sa position (poids); ajouter éventuellement une entrée de menu pour pointer sur le composant, avec le même poids que le composant. Les fichiers d’index peuvent porter l’extension .Rmd ou .md. Dans le premier cas, ils seront traités par blogdown, qui supporte l’intégration de code R. Dans l’autre cas, ils seront traités par Hugo, qui ne gère que le format markdown standard. Les fichiers .md nécessitent moins de ressource et sont donc préférés quand ils suffisent. 4.7.7.7 Finitions L’icône du site, qui apparaît dans la barre d’adresse des navigateurs web, se trouve dans assets/images. Le fichier icon.png peut être remplacé. 4.7.8 Intégration continue La construction du site web en production peut être confiée à GitHub (section 6.3.4), y compris sa mise à jour périodique si des pages du site traitent des données qui évoluent dans le temps. 4.7.9 Mises à jour Le thème Academic est régulièrement mis à jour. La version utilisée est indiquée dans le fichier go.mod. Pour utiliser la dernière version officielle, exécuter dans la console R la commande suivante: blogdown::hugo_cmd("mod get -u") Les fichiers go.mod et go.sum, qui contient les codes de hachage des fichiers du module, sont mis à jour. Chaque changement de version peut nécessiter des adaptations du contenu du site, référencées dans la documentation en ligne du thème89. Mettre Hugo à jour en même temps: blogdown::update_hugo() 4.8 Exportation de figures Quand la production de documents avec R Markdown n’est pas possible, les figures issues de R doivent être exportées sous forme de fichiers pour être intégrés dans un autre processus d’écriture. Il est préférable de créer des scripts pour créer les figures de façon reproductible et au format optimal. 4.8.1 Formats vectoriels et raster Les figures doivent en général être produites dans un format vectoriel: SVG pour la publication d’affiches ou de posters; EMF (Extended Meta-File) pour Word ou la suite Microsoft Office qui ne supporte pas d’autres formats; EPS (Encapsulated PostScript) ou PDF (Portable Document Format) pour LaTeX. Les figures raster (composées d’un ensemble de points, comme les photographies) sont rares dans R. La fonction image() utilisée pour afficher des cartes utilise par défaut des polygones plutôt que des points. La figure 4.10 montre le résultat du code suivant: x <- 10 * (1:nrow(volcano)) y <- 10 * (1:ncol(volcano)) image(x, y, volcano, col = hcl.colors(100, "terrain"), axes = FALSE) contour(x, y, volcano, levels = seq(90, 200, by = 5), add = TRUE, col = "brown") axis(1, at = seq(100, 800, by = 100)) axis(2, at = seq(100, 600, by = 100)) box() Figure 4.10: Courbes de niveau du volcan Maunga Whau, code fourni en exemple de l’aide de la fonction image(). Elle est composée d’un ensemble de rectangles colorés: il s’agit bien d’une image vectorielle. Si nécessaire, des images peuvent être produites aux formats BMP (bitmap, sans compression), JPEG (compressées avec perte de qualité), PNG (compressées sans perte de qualité, avec transparence possible) ou Tiff (compressées ou non). 4.8.2 Fonctions La fonction postscript() produit un fichier EPS. Le code R doit appeler la fonction pour créer le fichier, produire la figure, puis fermer le fichier, par exemple: # Ouverture du fichier postscript("Fig1.eps", width = 6, height = 4, horizontal = FALSE) # Création de la figure plot(cars) # Fermeture du fichier dev.off() ## pdf ## 2 La largeur et la hauteur (en pouces) d’un fichier vectoriel n’ont pas d’importance, mais leur rapport fixe l’aspect de la figure. La taille des textes est fixe: augmenter la taille de la figure revient donc à diminuer la taille relative des textes: procéder par essais successifs, en veillant à ce que les légendes restent lisibles à la taille finale de la figure. L’argument horizontal fixe l’orientation de la figure de façon assez imprévisible: procéder par essais. Les fonctions eps(), pdf(), bmp(), jpeg(), png() et tiff() fonctionnent de la même manière. Se référer à l’aide des fonctions pour le choix des options (résolution, niveau de compression, etc.). La fonction emf() est fournie par le package devEMF. Les polices de caractères ne sont pas incluses dans les fichiers EPS ou PDF. Si nécessaire, la fonction embedFonts() permet d’y remédier, à condition que GhostScript soit installé. 4.8.3 Package ragg Le package ragg90 améliore la qualité des fichiers PNG, JPEG et TIFF. Les fonctions optimisées sont agg_png(), agg_jpeg()et agg_tiff(). Leur usage est le même que celui des fonctions de grDevices. Les documents R Markdown produisent des images au format PNG pour leur version HTML. ragg améliore leur qualité: le package doit être installé et dev = \"ragg_png\" doit être ajoutée aux options de knitr. Pour ce document, les options déclarées dans index.Rmd sont les suivantes: knitr::opts_chunk$set( cache=FALSE, # Cache chunk results echo = TRUE, # Show/Hide R chunks warning=FALSE, # Show/Hide warnings # Figure alignment and size fig.align='center', out.width='80%', fig.asp=.75, # Graphic devices (ragg_png is better than standard png) dev = c("ragg_png", "pdf"), # Code chunk format tidy=TRUE, tidy.opts=list(blank=FALSE, width.cutoff=60), size="scriptsize", knitr.graphics.auto_pdf = TRUE ) options(width=60) Enfin, ragg peut être utilisé comme moteur de rendu graphique par défaut dans RStudio à partir de la version 1.4 (Menu “Tools > Global Options > General > Graphics > Backend”). 4.9 Flux de travail Un flux de travail (voir section 2.8) peut être intégré dans un document R Markdown à partir de la version 0.5 du package targets. library("targets") 4.9.1 Déclaration du flux Le flux est géré par des bouts de code de type targets. Leur entête minimal est {targets} au lieu de {r}, et ils doivent être nommés. Ces bouts de code permettent de créer le fichier _targets.R quand ils sont exécutés en mode non interactif, notamment pendant que le document est tricoté. S’ils sont lancés en mode interactif, par exemple dans R Studio, leur code est exécuté. L’option tar_interactive = FALSE dans leur entête permet de les tester sans tricoter tout le document. Un ancien flux éventuel doit être supprimé avant d’écrire le nouveau: tar_unscript() Le premier bout de code, avec l’option tar_globals=TRUE, écrit les options globales du flux. Pour créer le flux présenté en section 2.8, le code est simplement: ```{targets targets_global, tar_globals=TRUE} # Packages tar_option_set(packages = c("spatstat", "dbmss")) ``` Les fonctions utilisées par les cibles sont déclarées dans ce type de bout de code: elles sont ajoutées à un fichier dans le dossier de travail _targets_r (différent du dossier _targets qui contient les fichiers de calcul des cibles). 4.9.2 Déclaration des cibles Les cibles elles-mêmes sont déclarées dans des bouts de code dont le nom est celui de la variable de destination. ```{targets X, tar_simple=TRUE} runifpoint(NbPoints) ``` Chaque cible nécessite un bout de code construit de cette manière. La valeur de la cible est la dernière valeur retournée, à la manière d’une fonction qui n’utiliserait pas return(). Pendant le tricot, ce code simplifié (tar_simple=TRUE) est transformé automatiquement en écriture de cible: tar_target(X, { runifpoint(NbPoints) }) ## Define target X from chunk code. ## Establish _targets.R and _targets_r/targets/X.R. La lecture du document est alourdie par cette syntaxe particulière: targets n’est pas utile pour des documents dont le code, rapide à exécuter, doit être affiché dans le texte. En revanche, si le code est long à exécuter et n’est pas affiché, son intérêt est considérable pour limiter le temps de calcul. Les autres bouts de code nécessaires pour compléter le flux sont les suivants : NbPoints: tar_target(NbPoints, { 1000 }) ## Define target NbPoints from chunk code. ## Establish _targets.R and _targets_r/targets/NbPoints.R. d: tar_target(d, { sum(pairdist(X))/NbPoints/(NbPoints-1) }) ## Define target d from chunk code. ## Establish _targets.R and _targets_r/targets/d.R. map: tar_target(map, { autoplot(as.wmppp(X)) }) ## Define target map from chunk code. ## Establish _targets.R and _targets_r/targets/map.R. 4.9.3 Exécution du flux Pour lancer le calcul des cibles, un bout de code standard ({r}) doit appeler tar_make(): tar_visnetwork() tar_make() ## • start target NbPoints ## • built target NbPoints ## • start target X ## • built target X ## • start target d ## • built target d ## • start target map ## • built target map ## • end pipeline tar_visnetwork() permet de vérifier que le flux est correct avant de l’exécuter. Au moment de la production finale du document, l’option include=FALSE peut être ajoutée à l’entête de ce bout de code pour qu’il ne produise aucun affichage. 4.9.4 Utilisation des résultats Les bouts de code qui utilisent les valeurs des cibles doivent les lire avec tar_read(): tar_read(map) 4.9.5 Contrôle de source Les fichiers de targets doivent être inclus au contrôle de source. De cette façon, les calculs effectués localement ne seront pas répétés par GitHub Actions (chapitre 6) et la construction du document sera rapide. References "],["chap-package.html", "5 Package 5.1 Premier package 5.2 Organisation du package 5.3 Vignette et pkgdown 5.4 Code spécifique aux packages 5.5 Bibliographie 5.6 Données 5.7 Tests unitaires 5.8 Fichier .gitignore 5.9 Intégration continue 5.10 CRAN", " 5 Package Les packages de R permettent d’étendre les fonctionnalités du logiciel par du code fourni par la communauté des développeurs. Ils sont la clé du succès de R parce qu’ils permettent de diffuser rapidement de nouvelles méthodes issues de la recherche ou d’ajouter de nouveaux outils qui peuvent devenir des standards, comme le tidyverse. Il est utile de produire un package quand on a écrit des nouvelles fonctions qui forment un ensemble cohérent. Un package à usage personnel ou limité à une équipe de travail est simple à mettre en place et le temps gagné en utilisant facilement la version à jour de chaque fonction amortit très rapidement le temps consacré à la fabrication du package. Ce type de package a vocation à être hébergé sur GitHub. Des packages à usage plus large, qui fournissent par exemple le code correspondant à une méthode publiée, sont placés dans le dépôt CRAN, d’où ils pourront être installés par la commande standard install.packages(). CRAN effectue des vérifications poussées du code et n’accepte que les packages passant sans aucun avertissement sa batterie de tests. Ils doivent respecter la politique91 du dépôt. La documentation pour la création de packages est abondante. L’ouvrage de référence est celui de Wickham (2015), à consulter en tant que référence. L’approche utilisée ici consiste à créer un premier package très rapidement pour comprendre que la démarche est assez simple. Il sera ensuite enrichi des éléments nécessaires à un package diffusé à d’autres utilisateurs que son concepteur: une documentation complète et des tests de bon fonctionnement notamment. 5.1 Premier package Cette introduction reprend les recommandations du blog Créer un package en quelques minutes92 de ThinkR. 5.1.1 Création Les packages ont une organisation stricte dans une structure de fichiers et de répertoires figée. Il est possible de créer cette structure manuellement mais des packages spécialisés peuvent s’en charger: usethis automatise la création des dossiers; roxygen2 permet d’automatiser la documentation obligatoire des packages; devtools est la boîte à outils du développeur, permettant notamment de construire et tester les packages; Les trois sont à installer en premier lieu: install.packages(c("usethis", "roxygen2", "devtools")) Le package à créer sera un projet RStudio. Dans le menu des projets, sélectionner “New Project > New Directory > R package using devtools…”, choisir le nom du projet et son dossier parent. Le package s’appellera multiple, dans le dossier %LOCALAPPDATA%\\ProjetsR en suivant les recommandations de la section 1.2.4. Le nom du package doit respecter les contraintes des noms de projets: pas de caractères spéciaux, pas d’espaces… Il doit aussi être évocateur de l’objet du package. Si le package doit être diffusé, toute sa documentation sera rédigée en Anglais, y compris son nom. La structure minimale est crée: un fichier DESCRIPTION qui indique que le dossier contient un package et précise au minimum son nom; un fichier NAMESPACE qui déclare comment le package intervient dans la gestion des noms des objets de R (son contenu sera mis à jour par roxygen2); un dossier R qui contient le code des fonctions offertes par le package (vide à ce stade). Le package peut être testé tout de suite: dans la fenêtre Build de RStudio, cliquer sur “Install and Restart” construit le package et le charge dans R, après avoir redémarré le programme pour éviter tout conflit. Dans la fenêtre Packages, multiple est maintenant visible. Il est chargé, mais ne contient rien. 5.1.2 Première fonction 5.1.2.1 Fichiers Les fonctions sont placées dans un ou plusieurs fichier .R dans le dossier R. L’organisation de ces fichiers est libre. Pour cet exemple, un fichier du nom de chaque fonction sera créé. Des fichiers regroupant les fonctions similaires ou un seul fichier contenant tout le code sont des choix possibles. Le choix fait ici est le suivant: un fichier qui contiendra le code commun à tout le package: package.R; un fichier commun à toutes les fonctions: fonctions.R. 5.1.2.2 Création La première fonction, double(), est créée et enregistrée dans le fichier fonctions.R: double <- function(number) { return(2 * number) } A ce stade, la fonction est interne au package et n’est pas accessible depuis l’environnement de travail. Pour s’en persuader, construire le package (Install and Restart) et vérifier le bon fonctionnement de la fonction: double(2) Le résultat est un vecteur composé de deux 0 parce que la fonction appelée est un homonyme du package base (voir sa documentation en tapant ?double): base::double(2) ## [1] 0 0 Pour que la fonction de notre package soit visible, elle doit être exportée en la déclarant dans le fichier NAMESPACE. C’est le travail de roxygen2 qui gère en même temps la documentation de chaque fonction. Pour l’activer, placer le curseur dans la fonction et appeler le menu “Code > Insert Roxygen Skeleton”. Des commentaires sont ajoutés avant la fonction: #' Title #' #' @param number #' #' @return #' @export #' #' @examples double <- function(number) { return(2 * number) } Les commentaires à destination de roxygen2 commencent par #': la première ligne contient le titre de la fonction, c’est-à-dire un descriptif très court: son nom en général; la ligne suivante (séparée par un saut de ligne) peut contenir sa description (rubrique Description dans l’aide); la suivante (après un autre saut de ligne) peut contenir plus d’informations (rubrique Details dans l’aide); les arguments de la fonction sont décrits par les lignes @param; @return décrit le résultat de la fonction; @export déclare que la fonction est exportée: elle sera donc utilisable dans l’environnement de travail; des exemples peuvent être ajoutés. La documentation doit être complétée: #' double #' #' Double value of numbers. #' #' Calculate the double values of numbers. #' #' @param number a numeric vector. #' #' @return A vector of the same length as `number` containing the #' transformed values. #' @export #' #' @examples #' double(2) #' double(1:4) double <- function(number) { return(2 * number) } Ne pas hésiter à s’inspirer de l’aide de fonctions existantes pour respecter les standards de R (ici: ?log): penser que les fonctions sont normalement vectorielles: number est par défaut un vecteur, pas un scalaire; certains éléments commencent par une majuscule et se terminent par un point parce que ce sont des paragraphes dans le fichier d’aide; le titre n’a pas de point final; la description des paramètres ne commence pas par une majuscule. La prise en compte des changements dans la documentation nécessitent d’appeler la fonction roxygenize(). Dans la fenêtre Build, le menu “More > Document” permet de le faire. Ensuite, construire le package (Install and Restart) et vérifier le résultat en exécutant la fonction et en affichant son aide: double(2) `?`(double) Il est possible d’automatiser la mise à jour de la documentation à chaque construction du package par le menu “Build > Configure Build Tools…”: cliquer sur “Configure” et cocher la case “Automatically reoxygenize when running Install and Restart”. C’est un choix efficace pour un petit package mais pénalisant quand le temps de mise à jour de la documentation s’allonge avec la complexité du package. La reconstruction du package est le plus souvent utilisée pour tester des modifications du code: sa rapidité est essentielle. La documentation pour roxygen2 supporte le format Markdown93. A ce stade, le package est fonctionnel: il contient une fonction et un début de documentation. Il est temps de lancer une vérification de son code: dans la fenêtre Build, cliquer sur “Check” ou utiliser la commande devtools::check(). L’opération réoxygène le package (met à jour sa documentation), effectue un grand nombre de tests et renvoie la liste des erreurs, avertissements et notes détectées. L’objectif est toujours de n’avoir aucune alerte: elles doivent être traitées immédiatement. Par exemple, le retour suivant est un avertissement sur la non-conformité de la licence déclarée: > checking DESCRIPTION meta-information ... WARNING Non-standard license specification: `use_gpl3_license()` Standardizable: FALSE 0 errors v | 1 warning x | 0 notes v Erreur : R CMD check found WARNINGs Pour la corriger, mettre à jour, exécuter la commande de mise à jour de la licence, en commençant par votre nom: options(usethis.full_name = "Eric Marcon") usethis::use_gpl3_license() La liste des licences valides est fournie par R94. Après correction, relancer les tests jusqu’à la disparition des alertes. 5.1.3 Contrôle de source Il est temps de placer le code sous contrôle de source. Activer le contrôle de source dans les options du projet (figure 3.2). Redémarrer RStudio à la demande. Créer un dépôt sur GitHub et y pousser le dépôt local, comme expliqué dans le chapitre 3. Créer le fichier README.md: # multiple An R package to compute mutiple of numbers. Le développement du package est ponctué par de nombreux commits à chaque modification et une publication (push) à chaque étape, validée par une incrémentation du numéro de version. 5.1.4 package.R Le fichier package.R est destiné à recevoir le code R et surtout les commentaires pour roxygen2 qui concernent l’ensemble du package. Le premier bloc de commentaire produira l’aide du package (?multiple). #' multiple-package #' #' Multiples of numbers #' #' This package allows simple computation of multiples #' of numbers, including fast algorithms for integers. #' #' @name multiple #' @docType package NULL Son organisation est identique à celle des documentations de fonctions, avec deux déclarations particulières pour le nom du package et le type de documentation. Le code NULL après les commentaires indique à roxygen2 qu’il n’y a pas de code R lié. La documentation est mise à jour par la commande roxygen2::roxygenise(). Après reconstruction du package, vérifier que l’aide est est apparue: ?multiple. 5.2 Organisation du package 5.2.1 Fichier DESCRIPTION Le fichier doit être complété: Package: multiple Title: Calculate multiples of numbers Version: 0.0.0.9000 Authors@R: person(given = "Eric", family = "Marcon", role = c("aut", "cre"), email = "e.marcon@free.fr", comment = c(ORCID = "0000-0002-5249-321X")) Description: This package allows simple computation of multiples of numbers, including fast algorithms for integers. License: GPL-3 Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) RoxygenNote: 7.1.1 Le nom du package est figé et ne doit pas être modifié. Son titre doit décrire en une ligne à quoi il sert. Le titre est affiché dans la fenêtre Packages à côté des noms des packages. La version doit respecter les conventions: Le premier nombre est la version majeure, 0 tant que le package n’est pas stable puis 1. La version majeure ne change que si le package n’est plus compatible avec ses versions précédentes, ce qui oblige les utilisateurs à modifier leur code. Le deuxième est la version mineure, incrémentée quand des fonctionnalités nouvelles sont ajoutées. Le troisième est la version de correction: 0 à l’origine, incrémentée à chaque correction de code sans nouvelle fonctionnalité. Le quatrième est réservé au développement, et commence à 9000. Il est incrémenté à chaque version instable et disparaît quand une nouvelle version stable (release) est produite. Exemple: une correction de bug sur la version 1.3.0 produit la version 1.3.1. Les versions de développement suivantes (instables, non destinées à l’usage en production) sont 1.3.1.9000 puis 1.3.1.9001, etc. Le numéro de version doit être mis à jour à chaque fois que le package est poussé sur GitHub. Quand le développement est stabilisé, la nouvelle version, destinée à être utilisée en production, est 1.3.2 si elle n’apporte pas de nouvelle fonctionnalité ou 1.4.0 dans le cas contraire. La description des auteurs est assez lourde mais simple à comprendre. Les identifiants Orcid des auteurs académiques peuvent être utilisés. Si le package a plusieurs auteurs, ils sont placés dans une fonction c(): c(person(...), person()) pour deux auteurs. Dans ce cas, il faut préciser le rôle de chacun : “cre” pour le créateur du package “aut” pour un auteur parmi les autres “ctb” pour un contributeur, qui peut avoir signalé un bug ou fourni un peu de code. La description du package en un paragraphe permet de donner plus d’informations. La licence précise la façon dont le package peut être utilisé et modifié. GPL-3 est une bonne valeur par défaut, mais d’autres choix sont possibles95. L’option LazyData signifie que les données d’exemples fournies avec le package peuvent être utilisées sans les appeler au préalable par la fonction data(): c’est le standard actuel. Enfin, les deux dernières lignes sont gérées par roxygen2. 5.2.2 Fichier NEWS.md Le fichier NEWS.md contient l’historique du package. Les nouvelles versions sont ajoutées en haut du fichier. Créer une première version du fichier: # multiple 0.0.0.9000 ## New features * Initial version of the package Les titres de premier niveau doivent contenir le nom du package et sa version. Les titres de niveau 2 sont libres, mais contiennent en général des rubriques comme “New features” et “Bug Fixes”. Pour ne pas multiplier les versions décrites, il est conseillé de modifier la version en cours et de compléter la documentation jusqu’au changement de version de correction (troisième nombre). Ensuite, l’entrée correspondant à cette version reste figée et une nouvelle entrée est ajoutée. 5.3 Vignette et pkgdown Une vignette est indispensable pour documenter correctement le package: usethis::use_vignette("multiple") Le fichier multiple.Rmd est créé dans le dossier vignettes. Ajouter un sous-titre dans son entête: la description courte du package: title: "multiple" subtitle: "Multiples of numbers" Le reste de l’entête permet à R de construire la vignette à partir de code R Markdown. Le corps de la vignette contient par défaut du code R pour déclarer les options de présentation des bouts de code et le chargement du package. Une introduction à l’utilisation du package doit être écrite dans ce documents, en R Markdown. Le package pkgdown permet de créer un site d’accompagnement du package96, qui reprend le fichier README.md comme page d’accueil, la vignette dans une rubrique “Get Started”, l’ensemble des fichiers d’aide avec leurs exemples exécutés (section “Reference”), le fichier NEWS.md pour un historique du package (section “Changelog”) et des informations du fichier DESCRIPTION. Créer le site avec usethis usethis::use_pkgdown() Construire ensuite le site. Cette commande sera exécutée à nouveau à chaque changement de version du package: pkgdown::build_site() Le site est placé dans le dossier docs. Ouvrir le fichier index.htm avec un navigateur web pour le visualiser. Dès que le projet sera poussé sur GitHub, activer les pages du dépôt pour que le site soit visible en ligne (voir section 3.6). pkgdown place le site dans le dossier docs. Ajouter l’adresse des pages GitHub dans une nouvelle ligne du fichier DESCRIPTION: URL: https://GitHubID.github.io/multiple L’ajouter aussi dans le fichier _pkgdown.yml qui a été créé vide, ainsi que l’option suivante: url: https://GitHubID.github.io/multiple development: mode: auto pkgdown place le site dans le dossier docs/dev si le site d’une version stable (à trois nombres) du package existe dans docs et que la version en cours est une version de développement (à quatre nombres). De cette façon, les utilisateurs d’une version de production du package ont accès au site sans qu’il soit perturbé par les versions de développement. Le site peut être enrichi de plusieurs façons: En ajoutant des articles au format R Markdown dans le dossier vignettes/articles; En améliorant sa présentation (regroupement des fonctions par thèmes, ajout de badges, d’un sticker97…): se référer à la vignette de pkgdown. Pour enrichir la documentation du package, il est possible d’utiliser un fichier README.Rmd au format R Markdown, à tricoter pour créer le README.md standard de GitHub, utilisé comme page d’accueil du site pkgdown, qui peut de cette façon présenter des exemples d’utilisation du code. La démarche est détaillée dans R Packages98. La complexité ajoutée est à comparer au gain obtenu: une page d’accueil simple (sans code) avec des liens vers la vignette et les articles est plus simple à mettre en œuvre. 5.4 Code spécifique aux packages 5.4.1 Importation de fonctions Créons une nouvelle fonction dans fonctions.R qui ajoute un bruit aléatoire à la valeur double: fuzzydouble <- function(number, sd = 1) { return(2 * number + rnorm(length(number), 0, sd)) } Le bruit est tiré dans une loi normale centrée d’écart-type sd et ajouté à la valeur calculée. rnorm() est une fonction du package stats. Même si le package est systématiquement chargé par R, le package d’appartenance de la fonction doit obligatoirement être déclaré: les seules exceptions sont les fonctions du package base. Le package stats doit d’abord être déclaré dans DESCRIPTION qui contient une instruction Imports:. Tous les packages utilisés par le code de multiple seront listés, séparés par des virgules. Imports: stats Cette “importation” signifie simplement que le package stats doit être chargé, mais pas nécessairement attaché (voir section 2.2), pour que multiple fonctionne. Ensuite, la fonction rnorm() doit être trouvable dans l’environnement du package multiple. Il y a plusieurs façons de remplir cette obligation. D’abord, le commentaire suivant pourrait être fourni pour roxygen2: #' @import stats Tout l’espace de nom du package stats serait attaché et accessible au package multiple. Ce n’est pas une bonne pratique parce qu’elle multiplie les risques de conflits de noms (voir section 2.2). Notons que la notion d’importation utilisée ici est différente de celle de DESCRIPTION, bien qu’elles aient le même nom. Il est préférable d’importer uniquement la fonction rnorm() en la déclarant dans la documentation de la fonction: #' @importFrom stats rnorm Ce n’est pas une pratique idéale non plus parce que l’origine de la fonction n’apparaîtrait pas clairement dans le code du package. La bonne pratique est de ne rien importer (au sens de roxygen2) et de qualifier systématiquement les fonctions d’autres packages avec la syntaxe package::fonction(). C’est la solution retenue ici parce que la directive @importFrom importerait la fonction dans tout le package multiple, pas seulement dans la fonction fuzzydouble(), au risque de créer des effets de bord (modifier le comportement d’une autre fonction du package qui n’assumerait pas l’importation de rnorm()). Finalement, le code de la fonction est le suivant: #' fuzzydouble #' #' Double value of numbers with an error #' #' Calculate the double values of numbers #' and add a random error to the result. #' #' @param number a numeric vector. #' @param sd the standard deviation of the Gaussian error added. #' #' @return A vector of the same length as `number` #' containing the transformed values. #' @export #' #' @examples #' fuzzydouble(2) #' fuzzydouble(1:4) fuzzydouble <- function(number, sd = 1) { return(2 * number + stats::rnorm(length(number), 0, sd)) } 5.4.2 Méthodes S3 Les méthodes S3 sont présentées en section 2.1.2. 5.4.2.1 Classes Les objets appartiennent à des classes: # Classe d'un nombre class(2) ## [1] "numeric" # Classe d'une fonction class(sum) ## [1] "function" En plus des classes de base, les développeurs peuvent en créer d’autres. 5.4.2.2 Méthodes L’intérêt de créer de nouvelles classes est de leur adapter des méthodes existantes, le cas le plus courant étant plot(). Il s’agit d’une méthode générique, c’est-à-dire un modèle de fonction, sans code, à décliner selon la classe d’objet à traiter. plot ## function (x, y, ...) ## UseMethod("plot") ## <bytecode: 0x7f9780f6c710> ## <environment: namespace:base> Il existe dans R de nombreuses déclinaisons de plot qui sont des fonctions dont le nom est de la forme plot.class(). stats fournit une fonction plot.lm() pour créer une figure à partir d’un modèle linéaire. De nombreux packages créent des classes adaptées à leurs objets et proposent une méthode plot pour chaque classe. Les fonctions peuvent être listées: # Quelques fonctions plot() head(methods(plot)) ## [1] "plot,ANY-method" "plot,color-method" ## [3] "plot.AccumCurve" "plot.acf" ## [5] "plot.ACF" "plot.addvar" # Nombre total length(methods(plot)) ## [1] 150 Inversement, les méthodes disponibles pour une classe peuvent être affichées: methods(class = "lm") ## [1] add1 alias anova ## [4] as_flextable case.names coerce ## [7] confint cooks.distance deviance ## [10] dfbeta dfbetas drop1 ## [13] dummy.coef effects extractAIC ## [16] family formula fortify ## [19] hatvalues influence initialize ## [22] kappa labels logLik ## [25] model.frame model.matrix nobs ## [28] plot predict print ## [31] proj qqnorm qr ## [34] residuals response rstandard ## [37] rstudent show simulate ## [40] slotsFromS3 summary variable.names ## [43] vcov ## see '?methods' for accessing help and source code La méthode print est utilisée pour afficher tout objet (elle est implicite quand on saisit seulement le nom d’un objet): my_lm <- lm(dist ~ speed, data = cars) # Equivalent de '> my_lm' print(my_lm) ## ## Call: ## lm(formula = dist ~ speed, data = cars) ## ## Coefficients: ## (Intercept) speed ## -17.579 3.932 Le méthode summary affiche un résumé lisible de l’objet: summary(my_lm) ## ## Call: ## lm(formula = dist ~ speed, data = cars) ## ## Residuals: ## Min 1Q Median 3Q Max ## -29.069 -9.525 -2.272 9.215 43.201 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) -17.5791 6.7584 -2.601 0.0123 * ## speed 3.9324 0.4155 9.464 1.49e-12 *** ## --- ## Signif. codes: ## 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 15.38 on 48 degrees of freedom ## Multiple R-squared: 0.6511, Adjusted R-squared: 0.6438 ## F-statistic: 89.57 on 1 and 48 DF, p-value: 1.49e-12 Les autres méthodes ont été créées spécifiquement pour les besoins du package stats. 5.4.2.3 Attribution d’un objet à une classe Pour qu’un objet appartient à une classe, il suffit de le déclarer: x <- 1 class(x) <- "MyClass" class(x) ## [1] "MyClass" Une façon plus élégante de le faire est d’ajouter la nouvelle classe à l’ensemble des classes auquel l’objet appartient déjà: y <- 1 class(y) <- c("MyClass", class(y)) class(y) ## [1] "MyClass" "numeric" Il n’y a aucune vérification de cohérence entre la structure réelle de l’objet et une structure de la classe qui serait déclarée ailleurs: le développeur doit s’assurer que les méthodes trouveront bien les bonnes données dans les objets qui déclarent lui appartenir. Dans le cas contraire, des erreurs se produisent: class(y) <- "lm" tryCatch(print(y), error = function(e) print(e)) ## <simpleError: $ operator is invalid for atomic vectors> 5.4.3 En pratique 5.4.3.1 Création d’une méthode générique De nouvelles méthodes génériques peuvent être créées et déclinées selon les classes. A titre d’exemple, créons une méthode générique triple qui calculera le triple des valeurs dans le package multiple, déclinée en deux fonctions distinctes: une pour les entiers et une pour les réels. Les calculs sur les nombres entiers plus rapides que ceux sur les réels, ce qui justifie l’effort d’écrire deux versions du code. # Méthode générique triple <- function(x, ...) { UseMethod("triple") } La méthode générique ne contient pas de code au-delà de sa déclaration. Sa signature (c’est-à-dire l’ensemble de ses arguments) est importante parce que les fonctions dérivées de cette méthode devront obligatoirement avoir les mêmes arguments dans le même ordre et pourront seulement ajouter des arguments supplémentaires avant ... (qui est obligatoire). Comme la nature du premier argument dépendra de la classe de chaque objet, l’usage est de l’appeler x. La méthode est déclinée en deux fonctions: triple.integer<- function (x, ...){ return(x * 3L) } triple.numeric<- function (x, ...){ return(x * 3.0) } Dans sa version entière, x est multiplié par 3L, le suffixe L signifiant que 3 doit être compris comme un entier. Dans sa version réelle, 3 est noté 3.0 pour montrer clairement qu’il s’agit d’un réel. Sous R, 3 sans autre précision est compris comme un réel. Le choix de la fonction dépend de la classe de l’objet passé en argument. # Argument entier class(2L) ## [1] "integer" # Résultat entier par la fonction triple.integer class(triple(2L)) ## [1] "integer" # Argument réel class(2) ## [1] "numeric" # Résultat réel par la fonction triple.numeric class(triple(2)) ## [1] "numeric" # Performance microbenchmark::microbenchmark(triple.integer(2L), triple.numeric(2), triple(2L)) ## Unit: nanoseconds ## expr min lq mean median uq ## triple.integer(2L) 324 335.0 27086.02 352 389.5 ## triple.numeric(2) 324 337.0 23376.28 352 395.0 ## triple(2L) 1306 1341.5 1967.55 1378 1445.5 ## max neval ## 2667049 100 ## 2299345 100 ## 49769 100 La mesure des performances par le package microbenchmark ne montre pas de différence entre les fonctions triple.integer() et triple.numeric comme attendu parce que le temps consacré au calcul lui-même est négligeable en comparaison du temps d’appel de la fonction. La méthode générique consomme beaucoup plus de temps que les calculs très simples ici. R teste en effet l’existence de fonctions correspondant à la classe de l’objet passé en argument aux méthodes génériques. Comme un objet peut appartenir à plusieurs classes, il recherche une fonction adaptée à la première classe, puis aux classes suivantes successivement. Cette recherche prend beaucoup de temps et justifie de réserver l’usage de méthodes génériques à la lisibilité du code plutôt qu’à une recherche de performance: l’intérêt des méthodes génériques est de fournir à l’utilisateur du code une seule fonction pour un objectif donné (plot pour réaliser une figure) quelles que soient les données à traiter. 5.4.3.2 Création d’une classe Dans un package, on créera des classes si les résultats des fonctions le justifient: structure de liste et identification de la classe à un objet (“lm” est la classe des modèles linéaires). Pour toute classe créée, les méthodes print, summary et plot (si une représentation graphique est possible) doivent être écrites. Ecrivons une fonction multiple() dont le résultat sera un objet d’une nouvelle classe, “multiple”, qui sera une liste mémorisant les valeurs à multiplier, le multiplicateur et le résultat. multiple <- function(number, times = 1) { # Calculate the multiples y <- number * times # Save in a list result <- list(x = number, y = y, times = times) # Set the class class(result) <- c("multiple", class(result)) return(result) } # Classe du résultat my_multiple <- multiple(1:3, 2) class(my_multiple) ## [1] "multiple" "list" L’appel à la fonction multiple() renvoie un objet de classe “multiple”, qui est aussi de classe “list”. En absence de fonction print.multiple(), R cherche la fonction print.list() qui n’existe pas et se rabat sur la fonction print.default(): my_multiple ## $x ## [1] 1 2 3 ## ## $y ## [1] 2 4 6 ## ## $times ## [1] 2 ## ## attr(,"class") ## [1] "multiple" "list" La fonction print.multiple doit donc être écrite pour un affichage lisible, limité au résultat: print.multiple <- function(x, ...) { print.default(x$y) } # Nouvel affichage my_multiple ## [1] 2 4 6 Les détails peuvent être présentés dans la fonction summary: summary.multiple <- function(object, ...) { print.default(object$x) cat("multiplied by", object$times, "is:\\n") print.default(object$y) } # Nouvel affichage summary(my_multiple) ## [1] 1 2 3 ## multiplied by 2 is: ## [1] 2 4 6 Enfin, une fonction plot et une fonction autoplot complètent l’ensemble: plot.multiple <- function(x, y, ...) { plot.default(y=x$y, x=x$x, type = "p", main = paste("Multiplication by", x$times), ...) } autoplot.multiple <- function(object, ...) { data.frame(x = object$x, y = object$y) %>% ggplot2::ggplot() + ggplot2::geom_point(ggplot2::aes_(x = ~x, y = ~y)) + ggplot2::labs(title = paste("Multiplication by", object$times)) } plot(my_multiple) autoplot(my_multiple) Pour des raisons techniques liées à l’évaluation non conventionnelle dans le tidyverse, les fonctions aes() doivent être remplacées par aes_() dans les packages et ajouter un ~ devant les noms des variables. Dans le cas contraire, la vérification du package renvoie une note indiquant que les variables x et y, utilisées par les arguments de aes() n’ont pas été déclarées et n’existent peut-être pas dans l’environnement local (voir section 2.2). 5.4.3.3 Documentation Les méthodes génériques et les fonctions qui les déclinent doivent être documentées comme n’importe quelle autre fonction. La gestion de l’espace des noms est un peu plus complexe: Les méthodes génériques doivent être exportées: #' @export Les fonctions dérivées de méthodes génériques ne doivent pas l’être mais être déclarées comme méthode, avec le nom de la méthode générique et la classe traitée. Etrangement, roxygen2 demande qu’une directive d’exportation soit ajoutée mais ne l’applique pas (comme il se doit) dans le fichier NAMESPACE qui est utilisé par R: #' @method plot multiple #' @export Les fonctions dérivées de méthodes génériques venant d’un autre package nécessitent d’importer la méthode générique si elle n’est pas fournie par base (print est fourni par base et n’est donc pas concerné): #' @importFrom graphics plot #' @importFrom ggplot2 autoplot Dans DESCRIPTION, le package d’origine de chaque générique doit être listé dans la directive Depends:, pas dans Imports:: Depends: R (>= 2.10), ggplot2, graphics Enfin, l’importation de fonctions du tidyverse nécessite aussi quelques précautions: le packagetidyverse est réservé à l’usage interactif de R: il n’est pas question de l’importer dans DESCRIPTION parce que ses dépendances peuvent changer et aboutir à des résultats imprévisibles; Le package magrittr fournit les tuyaux, principalement %>%. Il doit être importé dans DESCRIPTION. Imports: magrittr, stats Comme il n’est pas possible de les préfixer %>% par le nom du package, il faut importer la fonction en utilisant les délimiteurs prévus pour les fonctions dont le nom contient des caractères spéciaux: #' @importFrom magrittr `%>%` Finalement, le code complet est le suivant: #' Multiplication of a numeric vector #' #' @param number a numeric vector #' @param times a number to multiply #' #' @return an object of class `multiple` #' @export #' #' @examples #' multiple(1:2,3) multiple <- function(number, times = 1) { # Calculate the multiples y <- number * times # Save in a list result <- list(x = number, y = y, times = times) # Set the class class(result) <- c("multiple", class(result)) return(result) } #' Print objects of class multiple #' #' @param x an object of class `multiple`. #' @param ... further arguments passed to the generic method. #' #' @export #' #' @examples #' print(multiple(2,3)) print.multiple <- function(x, ...) { print.default(x$y) } #' Summarize objects of class multiple #' #' @param object an object of class `multiple`. #' @param ... further arguments passed to the generic method. #' #' @export #' #' @examples #' summary(multiple(2,3)) summary.multiple <- function(object, ...) { print.default(object$x) cat("multiplied by", object$times, "is:\\n") print.default(object$y) } #' Plot objects of class multiple #' #' @param x a vector of numbers #' @param y a vector of multiplied numbers #' @param ... further arguments passed to the generic method. #' #' @importFrom graphics plot #' @export #' #' @examples #' plot(multiple(2,3)) plot.multiple <- function(x, y, ...) { plot.default(y=x$y, x=x$x, type = "p", main = paste("Multiplication by", x$times), ...) } #' autoplot #' #' ggplot of the `multiple` objects. #' #' @param object an object of class `multiple`. #' @param ... ignored. #' #' @return a `ggplot` object #' @importFrom ggplot2 autoplot #' @importFrom magrittr `%>%` #' @export #' #' @examples #' autoplot(multiple(2,3)) autoplot.multiple <- function(object, ...) { data.frame(x = object$x, y = object$y) %>% ggplot2::ggplot() + ggplot2::geom_point(ggplot2::aes_(x = ~x, y = ~y)) + ggplot2::labs(title = paste("Multiplication by", object$times)) } 5.4.4 Code C++ L’utilisation de code C++ a été vue en section 2.5. Pour intégrer ces fonctions dans un packages, il faut respecter les règles suivantes: les fichiers .cpp contenant le code sont placés dans le dossier /src du projet; le code est commenté pour roxygen2 de la même façon que les fonctions R, mais avec le marqueur de commentaire du langage C: #include <Rcpp.h> using namespace Rcpp; //' timesTwo //' //' Calculates the double of a value. //' //' @param x A numeric vector. //' @export // [[Rcpp::export]] NumericVector timesTwo(NumericVector x) { return x * 2; } dans DESCRIPTION, importer les packages. Rcpp, et RcppParallel si du code parallélisé est utilisé (supprimer ses références sinon), doivent être déclarés dans LinkingTo: Imports: Rcpp, RcppParallel LinkingTo: Rcpp, RcppParallel les commentaires pour roxygen2 doivent être ajoutés à package.R (“multiple” est le nom du package): #' @importFrom Rcpp sourceCpp #' @importFrom RcppParallel RcppParallelLibs #' @useDynLib multiple, .registration = TRUE les fichiers de travail de C++ sont exclus du contrôle de source dans .gitignore: # C binaries src/*.o src/*.so src/*.dll Ces modifications sont en partie effectuées automatiquement, pour Rcpp seulement, par usethis, mais l’insertion manuelle du code est plus rapide et fiable: ne pas utiliser cette commande. # usethis::use_rcpp() La construction du package entraînera la compilation du code: les Rtools sont donc indispensables. 5.4.5 Package bien rangé Tout package moderne doit être compatible avec le tidyverse, ce qui nécessite peu d’efforts: pour permettre l’utilisation de pipelines, l’argument principal des fonctions doit être le premier; les fonctions qui transforment des données doivent accepter un dataframe ou un tibble comme premier argument et retourner un objet du même format; les méthodes plot() doivent être doublées de méthodes autoplot() avec les mêmes arguments qui produisent le même graphique avec ggplot2. 5.5 Bibliographie La documentation d’un package fait appel à des références bibliographiques. Elles peuvent être gérées automatiquement avec Rdpack et roxygen2. Les références utilisées dans les fichiers R Markdown (vignette, site produit par pkgdown) ne sont pas concernées. 5.5.1 Préparation Les références bibliographiques doivent être placées dans un fichier bibtex REFERENCES.bib placé dans le dossier inst. Ce dossier contient des fichiers qui seront placés à la racine du dossier du package quand il sera installé. Ajouter la ligne suivante à DESCRIPTION: RdMacros: Rdpack Ajouter aussi le package Rdpack à la liste des packages importés: Imports: magrittr, stats, Rcpp, Rdpack Enfin, importer la fonction reprompt() de Rdpack en ajoutant les lignes suivantes à la documentation pour roxygen2 dans package.R: #' @importFrom Rdpack reprompt 5.5.2 Citations Les références sont citées par la commande \\insertCite{key}{package} dans la documentation destinée à roxygen2. package est le nom du package dans lequel le fichier REFERENCES.bib doit être cherché: ce sera normalement le package en cours, mais les références d’autres packages sont accessibles, à la seule condition qu’ils utilisent Rdpack. key est l’identifiant de la référence dans le fichier. Exemple99: documentation du package SpatDiv hébergé sur GitHub, fichier .R du package: #' SpatDiv #' #' Spatially Explicit Measures of Diversity #' #' This package extends the **entropart** package #' \\insertCite{Marcon2014c}{SpatDiv}. #' It provides spatially explicit measures of #' diversity such as the mixing index. La référence citée se trouve dans inst/REFERENCES.bib: @Article{Marcon2014c, author = {Marcon, Eric and Herault, Bruno}, title = {entropart, an R Package to Partition Diversity}, journal = {Journal of Statistical Software}, year = {2015}, volume = {67}, number = {8}, pages = {1--26}, } Les citations sont entre parenthèses. Pour placer le nom de l’auteur hors de la parenthèse, ajouter la déclaration ;textual: \\insertCite{Marcon2014c;textual}{SpatDiv} Pour citer plusieurs références (forcément du même package), les séparer par des virgules. A la fin de la documentation d’un objet utilisant des citations, ajouter systématiquement une liste des références: #' @references #' \\insertAllCited{} 5.6 Données Des données peuvent être intégrées à un package, notamment pour la clarté des exemples. La méthode la plus simple consiste à utiliser use_this. Créer des variables contenant les données à sauvegarder puis les sauvegarder: seq1_10 <- 1:10 seq1_100 <- 1:100 usethis::use_data(seq1_10, seq1_100) Un fichier .rda est créé dans le dossier data pour chaque variable créée. Avec l’option LazyData activée dans DESCRIPTION, les variables seront disponibles dès le chargement du package, mais ne seront effectivement chargées en mémoire qu’après leur première utilisation. Chaque variable doit être documentée dans le fichier package.R: #' seq1_10 #' #' A sequence of numbers from 1 to 10 #' #' @format A numeric vector. #' @source Values computed by the R software, #' \\url{https://www.r-project.org/} "seq1_10" Le nom de la variable est donné entre guillemets après le bloc de commentaires (à la place du code R d’une fonction). @format décrit le format des données et @source permet d’indiquer leur source. 5.7 Tests unitaires Dans l’idéal, tout le code inclus dans un package devrait être testé de multiples façons: contre les erreurs de syntaxe: les procédures de vérification de R s’en chargent assez bien; pour vérifier la conformité des résultats de calculs aux valeurs attendues; contre la survenue d’erreurs si les utilisateurs n’utilisent pas le code comme le développeur l’a prévu (arguments incorrects passés aux fonctions, données inadéquates…). Les tests unitaires sont utilisés dans les deux derniers objectifs. Ils s’appuient sur testthat à intégrer au package: usethis::use_testthat() ## ## Attaching package: 'testthat' ## The following object is masked from 'package:targets': ## ## matches ## The following object is masked from 'package:dplyr': ## ## matches ## The following object is masked from 'package:purrr': ## ## is_null ## The following objects are masked from 'package:readr': ## ## edition_get, local_edition ## The following object is masked from 'package:tidyr': ## ## matches Les tests doivent être ajoutés sous la forme de fichiers .R dont le nom commence obligatoirement par test dans le dossier tests/testthat. Chaque test (donc le contenu de chaque fichier) commence par son contexte, c’est-à-dire ce un ensemble de tests. Exemple, dans un fichier test_double.R: context("function double") Les tests sont contenus dans des fichiers qui les regroupent par thème, par exemple test_double.R. Le nom de chaque test est passé comme argument de la fonction test_that()): test_that("Double values are correct", { skip_on_cran() x <- 1:2 # 2 x 2 should be 4 expect_equal(double(x), c(2, 4)) # The result should be a number (type = 'double') expect_type(double(x), "double") # Error management expect_error(double("a")) }) ## Test passed 🎊 Toutes les fonctions commençant par expect permettent de comparer leur premier argument à un résultat: dans l’exemple ci-dessus, le résultat de double(1:2) doit être 2 4 et le type de ce vecteur doit être réel à double précision. Le dernier test vérifie qu’une chaîne de caractère passée comme argument génère une erreur, ce qui n’est pas optimal: si le package traitait l’erreur, le message retourné pourrait être testé. La commande skip_on_cran(), à utiliser systématiquement, évite de lancer les tests sur CRAN quand le package y sera déposé: CRAN dispose de ressources limitées et restreint strictement le temps de vérification des packages sur sa plateforme. Les tests devront donc être réalisés sur GitHub, grâce à l’intégration continue, voir section 5.9. Les tests peuvent être lancés par le menu “More > Test package” de la fenêtre Build ou par la commande devtools::test(). Il est conseillé d’écrire les tests dès qu’une fonction du package est stabilisée. 5.8 Fichier .gitignore Le fichier .gitignore obtenu à ce stade est incomplet. Il peut être remplacé par celui-ci: # History files .Rhistory .Rapp.history # Session Data files .RData # Example code in package build process *-Ex.R # Output files from R CMD build /*.tar.gz # Output files from R CMD check /*.Rcheck/ # RStudio files .Rproj.user/ .Rprofile # knitr and R markdown default cache directories *_cache/ /cache/ # Temporary files created by R markdown *.utf8.md *.knit.md # C binaries src/*.o src/*.so src/*.dll /src-i386/ /src-x64/ # uncomment if pkgdown is run by CI # docs/ La dernière ligne concerne le dossier docs/, qui reçoit le site web produit par pkgdown. Elle est commentée tant que la production du site est réalisée localement, mais décommentée si elle est confiée à GitHub Actions (voir section suivante). 5.9 Intégration continue La vérification (Check) du package doit être effectuée à chaque étape du développement, ce qui consomme un temps considérable. Elle peut être automatisée très simplement avec le service GitHub Actions, déclenché à chaque modification du dépôt sur GitHub. L’analyse de la couverture du code par les tests (quelles parties du codes sont testées ou non) sera ajoutée. GitHub est également capable de reconstruire la documentation du package avec pkgdown, autre opération consommatrice de ressources, après la réussite des tests. La section 6.3.5 détaille le moyen de le faire. 5.10 CRAN Les packages dont l’audience dépasse l’entourage de l’auteur peuvent être déposés sur CRAN. Les règles à respecter sur CRAN sont nombreuses100. Elles sont vérifiées par la commande de vérification R CMD check avec l’option -- as.cran. La vérification ne doit renvoyer aucune erreur, aucun avertissement, ni aucune note avant de soumettre le package. 5.10.1 Test du package La vérification du package par GitHub dans le cadre de l’intégration continue n’est pas suffisante. Le package doit être testé sur la version de développement de R. Le site R-hub builder101 permet de le faire simplement. Le package, dont la version ne doit pas être de développement (limitée à trois nombres, voir section 5.2.1), doit être construit au format source: dans la fenêtre Build de RStudio, cliquer sur “More > Build Source Package”. Sur le site R-hub builder, cliquer sur “Advanced”, sélectionner le fichier source du package et la plateforme de test: Debian Linux, R-devel, GCC. 5.10.2 Soumission Quand le package est au point, la soumission à CRAN se fait par le site web dédié102. En cas de rejet, traiter les demandes et soumettre à nouveau en incrémentant le numéro de version. 5.10.3 Maintenance Des demandes de corrections sont envoyées par CRAN de temps à autre, notamment lors des changements de version de R. L’adresse de messagerie du responsable du package (maintainer) doit rester valide et les demandes doivent être traitées rapidement. Dans le cas contraire, le package est archivé. Les nouvelles versions du package sont soumises de la même façon que la première. References "],["chap-ci.html", "6 Intégration continue 6.1 Outils 6.2 Principes 6.3 Modèles de scripts 6.4 Ajouter des badges", " 6 Intégration continue L’intégration continue consiste à confier à un service externe la tâche de vérifier un package, produire des documents Markdown pour les pages web d’un dépôt GitHub ou tricoter entièrement un site web à partir du code. Toutes ces tâches peuvent être accomplies localement sur le poste de travail mais prennent du temps et risquent de ne pas être répétées à chaque mise à jour. Dans le cadre de l’intégration continue, elles le sont systématiquement, de façon transparente pour l’utilisateur. En cas d’échec, un message d’alerte est envoyé. La mise en place de l’intégration continue se justifie pour des projets lourds, avec des mises à jour régulières. plutôt que pour des projets contenant un simple document Markdown rarement modifié. 6.1 Outils 6.1.1 GitHub Actions L’outil utilisé le plus fréquemment pour des projets R déposés sur GitHub était Travis CI103 mais le service est devenu payant en 2021. Les Actions GitHub remplacent avantageusement Travis. Ce service est intégré à GitHub. 6.1.2 Codecov Pour évaluer le taux de couverture du code des packages R, c’est-à-dire la proportion du code testé d’une façon ou d’une autre (exemples, tests unitaires, vignette), le service Codecov104 s’intègre parfaitement à GitHub. Il faut ouvrir un compte, de préférence en s’authentifiant par GitHub. 6.1.3 GitHub Pages Les pages web de GitHub peuvent être hébergées dans le répertoire docs de la branche master du projet: c’est la solution retenue quand elle sont produites sur le poste de travail. Si elles sont produites par intégration continue, elle le seront obligatoirement dans une branche dédiée appelée gh-pages. 6.2 Principes Un projet de document est traité en exemple. L’objectif est de faire tricoter par GitHub un projet Markdown. Cette pratique est appropriée pour les projets d’ouvrages, qui nécessitent beaucoup de ressources pour leur construction. Dans ce type de projet, le code est tricoté par knitr pour produire plusieurs documents, typiquement aux formats HTML et PDF, accessibles sur les pages GitHub. Quand les documents sont produits localement, ils sont placés dans le dossier docs et poussés sur GitHub. Pour que GitHub s’en charge, quelques réglages sont nécessaires. 6.2.1 Obtention d’un jeton d’accès personnel Pour écrire sur GitHub, le service d’intégration continue devra s’authentifier au moyen d’un jeton d’accès personnel (Personal Access Token: PAT) dont la création est décrite en section 1.4.4. Générer un nouveau jeton, le décrire en tant que “GitHub Actions” et lui donner l’autorisation “repo”, c’est-à-dire modifier tous les dépôts (il n’est pas possible de limiter l’accès à un dépôt particulier). 6.2.2 Secrets du projet Sur GitHub, afficher les paramètres du projet et sélectionner “Secrets”. Le bouton “New Repository Secret” permet de stocker des variables utilisées dans les scripts des Actions GitHub (visibles publiquement) sans en diffuser la valeur. Le jeton d’accès personnel est indispensable pour que les Actions GitHub puissent écrire leur production dans le projet. Créer un secret nommé “GH_PAT” et saisir la valeur du jeton sauvegardée précédemment. Après avoir cliqué sur “Add Secret”, le jeton ne pourra plus être lu. Pour permettre l’envoi de messages de succès ou d’échec sans diffuser son adresse de messagerie, créer un secret nommé “EMAIL” qui la contient. 6.2.3 Activation du dépôt sur CodeCov L’analyse de la couverture du code des packages est utile pour détecter les portions de code non testées. En revanche, l’analyse de la couverture des projets de document n’a pas d’intérêt. Pour activer un dépôt, il faut d’authentifier sur le site de CodeCov avec son compte GitHub. La liste des dépôts est affichée et peut être actualisée. Si les dépôts à traiter sont hébergés par une organisation, par exemple les dépôts d’une salle de classe GitHub, il faut actualiser la liste des organisations en suivant les instructions (un lien permet de modifier rapidement les options de GitHub pour autoriser la lecture d’une organisation par Codecov) et à nouveau mettre à jour la liste des dépôts. Enfin, quand le dépôt recherché est visible, il faut l’activer. Il est inutile d’utiliser le système de jetons de Codecov. 6.2.4 Scripter les actions de GitHub Un flux de travail (workflow) de GitHub est une succession de tâches (jobs) comprenant des étapes (steps). Un flux de travail est déclenché par un évènement, généralement chaque push du projet, mais aussi à intervalles réguliers (cron). Typiquement, les flux créés ici contiennent deux tâches: la première installe R et les composants nécessaires et exécute des scripts R (ce qui constitue ses étapes successives); la seconde publie des fichiers obtenus dans les pages GitHub. Les flux de travail sont configurés dans un fichier au format YAML placé dans le dossier .github/workflows/ du projet. Les différentes parties du script sont présentées ci-dessous. Le script complet est celui de ce document, accessible sur GitHub105. 6.2.4.1 Déclenchement L’action est déclenchée à chaque fois que des mises à jour sont poussées sur GitHub: on: push: branches: - master La branche prise en compte est master (à remplacer par main le cas échéant). Pour déclencher l’action périodiquement, il faut utiliser la syntaxe de cron (le système de planification des tâches sous Unix): on: schedule: - cron: '0 22 * * 0' # every sunday at 22:00 Les valeurs successives sont celles des minutes, des heures, du jour (quantième du mois), du mois et du jour de la semaine (0 pour dimanche à 6 pour samedi). Les * permettent d’ignorer une valeur. Les entrées push et schedule peuvent être utilisées ensemble: on: push: branches: - master schedule: - cron: '0 22 * * 0' Actuellement, la planification n’est prise en compte que dans la branche master. 6.2.4.2 Nom du flux de travail Le nom du flux est libre. Il sera affiché par le badge qui sera ajouté dans le fichier README.md du projet (voir section 6.4). name: bookdown 6.2.4.3 Première tâche Les tâches sont décrites dans la rubrique jobs. renderbook est le nom de la première tâche: il est libre. Ici, l’action principale consistera à produire un ouvrage bookdown avec la fonction render_book(), d’où son nom. jobs: renderbook: runs-on: macOS-latest La déclaration runs-on décrit le système d’exploitation sur lequel la tâche doit s’exécuter. Les choix possibles sont Windows, Ubuntu ou MacOS106. L’intégration continue de R sur GitHub utilise habituellement MacOS qui a l’avantage d’utiliser des packages R compilés donc beaucoup plus simples (certains packages nécessitent des librairies extérieures à R pour leur compilation) et rapides à installer, tout en permettant l’usage de scripts. 6.2.4.4 Premières étapes Les étapes sont décrites dans la rubrique steps. steps: - name: Checkout repo uses: actions/checkout@v2 - name: Setup R uses: r-lib/actions/setup-r@v1 - name: Install pandoc run: | brew install pandoc Chaque étape est décrite par son nom (libre) et ce qu’elle réalise. La force de GitHub Actions est de permettre l’utilisation d’actions écrites par d’autres et stockées dans un projet public GitHub. Une action est un script accompagné de métadonnées qui décrivent son usage. Son développement est accompagné par des numéros de version successifs. On appelle une action par l’instruction uses:, le projet GitHub qui la contient et sa version. Dans leur projet GitHub respectif, les actions existent dans leur version de développement (@master) et dans des versions d’étape (release) accessibles par leur numéro (@v1). Ces versions d’étape sont préférables parce qu’elles sont stables. Les actions généralistes sont mises à disposition par GitHub dans l’organisation GitHub Actions107. L’action “actions/checkout” permet de se placer dans la branche principale du projet traité par le flux de travail: c’est en général la première étape de tous les flux. L’action suivante est l’installation de R, mise à disposition par l’organisation R infrastructure108. L’installation de pandoc (logiciel extérieur à R mais nécessaire à R Markdown) peut être réalisée par une commande exécutée par MacOS. Elle est appelée par run: et peut contenir plusieurs lignes (d’où le |). Ce script dépend du système d’exploitation: brew est le gestionnaire de paquets de MacOS. Pour éviter les spécificités d’un système, il est préférable d’utiliser une action: - name: Install pandoc uses: r-lib/actions/setup-pandoc@v1 6.2.4.5 Caches L’installation des packages de R prend du temps, beaucoup s’ils sont installés à partir des sources (la procédure standard sous Ubuntu, mais pas sous MacOS et Windows où les packages binaires sont utilisés par défaut). Le calcul des bouts de code est en général l’étape la plus longue du flux de travail. L’action cache permet de mettre en cache les résultats des deux opérations. - name: Cache Renv packages uses: actions/cache@v2 with: path: $HOME/.local/share/renv key: r-${{ hashFiles('renv.lock') }} restore-keys: r- - name: Cache bookdown results uses: actions/cache@v2 with: path: _bookdown_files key: bookdown-${{ hashFiles('**/*Rmd') }} restore-keys: bookdown- Le cache est mis à jour en cas de modification d’un package ou d’un bout de code, ce qui nécessite un moyen rapide de vérifier les modifications: une valeur de contrôle (hashtag) est calculée par la fonction hashFiles() à partir du fichier renv.lock (voir ci-dessous) pour les packages et l’ensemble des fichiers .Rmd pour les bouts de code. Tout changement entraîne la réinstallation des packages ou le recalcul de l’ensemble du code: la gestion du cache est moins fine que celle de R sur un poste de travail, qui ne recalcule que les bouts de code modifiés. 6.2.4.6 Packages L’installation des packages est gérée par la fonction install.packages(). Plutôt que d’énumérer les packages à installer dans les arguments de la fonction, source d’erreur, il est préférable d’utiliser le package renv pour enregistrer tous les packages utilisés par le projet et les installer en une fois pour l’intégration continue. renv installera les packages dans la version enregistrée, ce qui permet d’éviter des effets imprévus dus à des versions différentes entre le poste de travail et GitHub Actions. - name: Install packages run: | R -e 'install.packages("renv")' R -e 'renv::restore()' Il est nécessaire d’installer renv sur le poste de travail utilisé pour le développement du projet. Il faut utiliser un fichier DESCRIPTION pour lister les packages de tout projet, comme si c’était un package R. Pour ce document: Package: travailleR Title: Travailler avec R Version: 1.1.0 Authors@R: c( person("Eric", "Marcon", , "e.marcon@free.fr", c("aut", "cre")) ) URL: https://github.com/EricMarcon/travailleR Imports: bookdown, (...) Avant de déclencher le flux de travail, il est nécessaire de créer la liste des packages dans leur version en cours sur le poste de travail: renv::snapshot(type = "explicit") A sa première utilisation, le package renv informe de quelques adaptations de l’environnement de travail, qu’il faut accepter. Cette commande crée le fichier renv.lock qui est utilisé par GitHub Actions pour installer les packages pendant l’intégration continue. Il pourra être mis à jour à tout moment pour prendre en compte leur mise à jour. Alternativement, les packages nécessaires peuvent être installés sans l’aide de Renv: - name: Install packages run: | options(pkgType = "binary") options(install.packages.check.source = "no") install.packages(c("remotes", "bookdown", "formatR", "tinytex")) tinytex::install_tinytex() remotes::install_deps(dependencies = TRUE) shell: Rscript {0} Cette étape utilise Rscript comme environnement de commande, ce qui lui permet d’exécuter directement des commandes R (à comparer à l’utilisation de R -e dans les exemples précédents). Les packages servant à produire le document sont listés: remotes pour sa fonction install_deps(); bookdown pour tricoter; formatR pour la mise en forme des bouts de code (tidy=TRUE); tinytex pour disposer d’une distribution LaTeX. Les autres packages, ceux utilisés par le projet, sont lus dans le fichier DESCRIPTION par la fonction install_deps(). Sous MacOS, les packages sont installés par défaut en version binaire, mais à partir de leur code source s’il est plus récent. La création des packages binaires prend quelques jours à CRAN: cette situation n’est donc pas rare. Les packages ne contenant que du code R ou du code C++ sans référence à des librairies externes s’installent en revanche sans problème. En revanche, si le package nécessite des librairies externes à R ou une compilation de code Fortran, l’installation échoue. Il serait donc nécessaire d’installer préalablement les librairies nécessaires (et éventuellement un compilateur Fortran) à l’ensemble des packages dont le projet dépend: cette solution n’est pas réaliste parce qu’elle implique l’inventaire de l’ensemble des dépendances, qui peuvent changer, et un nombre important d’installations chronophages et inutiles la plupart du temps, quand les packages binaires sont à jour. Une meilleure solution est de forcer l’installation des packages binaires même si le code source est plus récent: c’est l’objet des deux options de R définies avant l’appel à install.packages(). Dans cette approche, les packages ne sont pas mis en cache. 6.2.4.7 Tricot La production de l’ouvrage est lancée par une commande R. - name: Render pdf book run: | bookdown::render_book("index.Rmd", "bookdown::pdf_book") shell: Rscript {0} - name: Render gitbook run: | bookdown::render_book("index.Rmd", "bookdown::gitbook") shell: Rscript {0} Les formats paramétrés dans _output.yml sont ignorés. Le fichier PDF doit être produit avant le format GitBook pour que son lien de téléchargement soit ajouté à la barre de menu du site GitBook. D’autre part, R doit être fermé et rouvert entre les deux rendus faute de quoi les tableaux ne sont pas créés correctement dans le GitBook109. Les deux étapes ne doivent pas être regroupées en une seule. 6.2.4.8 Sauvegarde Le résultat du tricot, placé dans le dossier docs de la machine virtuelle en charge de l’intégration continue, doit être préservé pour que la tâche suivante puisse l’utiliser. La dernière étape de la tâche de production utilise l’action upload-artifact pour cela. - name: Upload artifact uses: actions/upload-artifact@v1 with: name: _book path: docs/ Le contenu de docs est sauvegardé en tant qu’artefact nommé \"_book\". Les artefacts sont visibles publiquement sur la page des Actions du projet GitHub. Après sa dernière étape, la machine virtuelle utilisée pour cette étape est détruite. 6.2.4.9 Publication La publication de l’artefact dans la branche gh-pages du projet nécessite une autre tâche. checkout-and-deploy: runs-on: ubuntu-latest needs: renderbook steps: - name: Checkout uses: actions/checkout@v2 - name: Download artifact uses: actions/download-artifact@v1 with: # Artifact name name: _book # Destination path path: docs - name: Deploy to GitHub Pages uses: Cecilapp/GitHub-Pages-deploy@v3 env: GITHUB_TOKEN: ${{ secrets.GH_PAT }} with: email: ${{ secrets.EMAIL }} build_dir: docs jekyll: no La tâche est nommée “checkout-and-deploy” (le nom est libre). Elle s’exécute sur une machine virtuelle sous Ubuntu. Elle ne peut se lancer que si la tâche “renderbook” a réussi. Ses étapes sont les suivantes: Checkout: Placement dans la branche principale du projet; Download artifact: Restauration du dossier docs; Deploy to GitHub Pages: copie du dossier docs dans la branche gh-pages. Cette dernière étape utiliser l’action GitHub-Pages-deploy mise à disposition par l’organisation Cecilapp . Elle utilise une variable d’environnement, GITHUB_TOKEN, pour s’authentifier et des paramètres: email: l’adresse de messagerie destinataire du rapport d’exécution. Pour ne pas exposer l’adresse publiquement, elle a été stockée dans un secret du projet; buid_dir: le répertoire à publier, jekyll:no pour créer un fichier vide nommé .nojekyll qui indique aux pages GitHub de ne pas essayer de traiter leur contenu comme un site web Jekyll. 6.3 Modèles de scripts Des modèles de scripts pour tous les types de projets sont présentés ici. Tous nécessitent même préparation: les secrets GH_PAT et EMAIL doivent être enregistrés dans le projet GitHub (section 6.2.2); un fichier DESCRIPTION doit être utilisé pour lister les packages nécessaires (section 5.2.1), quel que soit le type de projet; un instantané des packages installés (renv.lock) doit être réalisé si renv (section 6.2.4.6) est utilisé. La branche gh-pages est créée automatiquement par les scripts. Vérifier après la première exécution que les pages GitHub sont bien activées sur cette branche (section 3.6). Supprimer ensuite le dossier docs s’il existait, pousser la modification sur GitHub et enfin ajouter la ligne suivante au fichier .gitignore pour pouvoir tricoter localement les projets sans perturber GitHub: docs/ 6.3.1 memoiR La fonction build_ghworkflow() du package memoiR crée automatiquement les scripts nécessaires à la production des modèles du package. Le script est toujours nommé memoir.yml. Ces scripts n’utilisent ni renv ni cache. Ils n’ont pas besoin d’un fichier DESCRIPTION pour l’installation des dépendances mais chaque document doit contenir son le bout de code de paramétrage (Options) la liste de tous les packages nécessaires à son tricot (stockés dans la variable Packages). 6.3.2 Projet d’ouvrage Le flux de travail s’appelle rmarkdown; sa tâche de production render. on: push: branches: - master name: rmarkdown jobs: render: runs-on: macOS-latest steps: - name: Checkout repo uses: actions/checkout@v2 - name: Setup R uses: r-lib/actions/setup-r@v1 - name: Install pandoc uses: r-lib/actions/setup-pandoc@v1 - name: Install dependencies run: | options(pkgType = "binary") options(install.packages.check.source = "no") install.packages(c("memoiR", "rmdformats", "tinytex")) tinytex::install_tinytex() shell: Rscript {0} - name: Render pdf book run: | bookdown::render_book("index.Rmd", "bookdown::pdf_book") shell: Rscript {0} - name: Render gitbook run: | bookdown::render_book("index.Rmd", "bookdown::gitbook") shell: Rscript {0} - name: Upload artifact uses: actions/upload-artifact@v1 with: name: ghpages path: docs checkout-and-deploy: runs-on: ubuntu-latest needs: render steps: - name: Checkout uses: actions/checkout@v2 - name: Download artifact uses: actions/download-artifact@v1 with: name: ghpages path: docs - name: Deploy to GitHub Pages uses: Cecilapp/GitHub-Pages-deploy@v3 env: GITHUB_TOKEN: ${{ secrets.GH_PAT }} with: email: ${{ secrets.EMAIL }} build_dir: docs jekyll: no 6.3.3 Articles et présentations Le flux de travail s’appelle rmarkdown; sa tâche de production render. on: push: branches: - master name: rmarkdown jobs: render: runs-on: macOS-latest steps: - name: Checkout repo uses: actions/checkout@v2 - name: Setup R uses: r-lib/actions/setup-r@v1 - name: Install pandoc uses: r-lib/actions/setup-pandoc@v1 - name: Install dependencies run: | options(pkgType = "binary") options(install.packages.check.source = "no") install.packages(c("memoiR", "rmdformats", "tinytex")) tinytex::install_tinytex() shell: Rscript {0} - name: Render Rmarkdown files run: | RMD_PATH=($(ls | grep "[.]Rmd$")) Rscript -e 'for (file in commandArgs(TRUE)) |> rmarkdown::render(file, "all")' ${RMD_PATH[*]} Rscript -e 'memoiR::build_githubpages()' - name: Upload artifact uses: actions/upload-artifact@v1 with: name: ghpages path: docs checkout-and-deploy: runs-on: ubuntu-latest needs: render steps: - name: Checkout uses: actions/checkout@v2 - name: Download artifact uses: actions/download-artifact@v1 with: name: ghpages path: docs - name: Deploy to GitHub Pages uses: Cecilapp/GitHub-Pages-deploy@v3 env: GITHUB_TOKEN: ${{ secrets.GH_PAT }} with: email: ${{ secrets.EMAIL }} build_dir: docs jekyll: yes L’étape chargée du tricot utilise un script pour lister tous les fichiers .Rmd, les traiter (tous les formats de sortie listés dans leur entête yaml sont produits). La fonction build_githubpages() (voir section 4.3.2) place les résultat dans docs. La tâche de déploiement indique aux pages GitHub d’utiliser Jekyll, c’est-à-dire d’utiliser le fichier README.md comme page d’accueil. 6.3.4 Site web blogdown Le fichier appelé blogkdown.yml est très similaire, mais le contexte est différent: le code du site web est ici dans la branche source du dépôt (voir section 4.7). Le nom du flux de travail est blogdown et celui de la tâche de production est buildsite. on: push: branches: - source schedule: - cron: '0 22 * * 0' name: blogdown jobs: buildsite: runs-on: macOS-latest steps: - name: Checkout repo uses: actions/checkout@v2 with: ref: 'source' - name: Setup R uses: r-lib/actions/setup-r@v1 - name: Install pandoc uses: r-lib/actions/setup-pandoc@v1 - name: Cache Renv packages uses: actions/cache@v2 with: path: $HOME/.local/share/renv key: r-${{ hashFiles('renv.lock') }} restore-keys: r- - name: Install packages run: | install.packages("renv") renv::restore() shell: Rscript {0} - name: Build website run: | blogdown::install_hugo(force=TRUE) blogdown::build_site(local = TRUE, build_rmd = TRUE) shell: Rscript {0} - name: Upload artifact uses: actions/upload-artifact@v1 with: name: _website path: public/ checkout-and-deploy: runs-on: ubuntu-latest needs: buildsite steps: - name: Checkout uses: actions/checkout@v2 with: ref: 'source' - name: Download artifact uses: actions/download-artifact@v1 with: # Artifact name name: _website # Destination path path: public - name: Deploy to GitHub Pages uses: Cecilapp/GitHub-Pages-deploy@v3 env: GITHUB_TOKEN: ${{ secrets.GH_PAT }} with: branch: 'master' build_dir: public email: ${{ secrets.EMAIL }} jekyll: no L’action checkout se place dans la branche source avec sa variable ref. Il n’est pas possible de mettre en cache les résultats des bouts de code parce qu’ils se trouvent dans les pages .Rmd du projet, dont l’emplacement n’est pas prévisible. Le cache se limite aux packages. L’utilisation de Renv se justifie parce que le site est reconstruit régulièrement sans intervention de l’auteur: la stabilité de son environnement permet d’éviter un échec dû à une mise à jour incompatible d’un package. La tâche Build website utilise le package blogdown pour installer Hugo (le générateur de sites web) et ensuite construire le site. Enfin, la tâche de déploiement se place dans la branche source pour récupérer le dossier public produit par la tâche de production et la déploie dans la branche master au lieu de la branche gh-pages habituelle pour respecter l’organisation de GitHub. Si le site web utilise des données en ligne qui justifient de le mettre à jour périodiquement, GitHub Actions peut être lancé tous les jours, toutes les semaines ou tous les mois en plus des reconstruction déclenchées par une modification du dépôt (voir section 6.2.4.1). Ici, le site est reconstruit tous les dimanches à 22h. Exemple: la page qui affiche la bibliométrie du site web110 de l’auteur interroge Google Scholar pour afficher les citations des publications. Le site est mis à jour toutes les semaines pour que les statistiques soient à jour. 6.3.5 Packages R Un script optimal pour la vérification d’un package est le suivant: on: push: branches: - master name: R-CMD-check jobs: R-CMD-check: runs-on: macOS-latest env: GITHUB_PAT: ${{ secrets.GH_PAT }} steps: - uses: actions/checkout@v2 - uses: r-lib/actions/setup-r@v1 - name: Install pandoc uses: r-lib/actions/setup-pandoc@v1 - name: Install dependencies run: | options(pkgType = "binary") options(install.packages.check.source = "no") install.packages(c("remotes", "rcmdcheck", "covr", "pkgdown")) remotes::install_deps(dependencies = TRUE) shell: Rscript {0} - name: Check run: rcmdcheck::rcmdcheck(args = "--no-manual", error_on = "warning") shell: Rscript {0} - name: Test coverage run: covr::codecov(type="all") shell: Rscript {0} - name: Install package run: R CMD INSTALL . - name: Pkgdown run: | git config --local user.email "actions@github.com" git config --local user.name "GitHub Actions" Rscript -e 'pkgdown::deploy_to_branch(new_process = FALSE)' Le fichier est nommé check.yml. Il ne contient qu’une seule tâche, nommée R-CMD-check comme le flux. Le script n’utilise pas Renv pour gérer les packages parce que la vérification d’un package doit fonctionner avec les versions en cours sur CRAN. remotes installe les packages nécessaires à partir du fichier DESCRIPTION. L’étape Check vérifie le package. Les avertissements sont traités comme des erreurs. L’étape Test coverage utilise le package covr pour mesurer le taux de couverture et téléverse les résultats sur le site Codecov. Enfin, les deux dernières étapes installent le package puis utilisent pkgdown pour créer le site de documentation du package et le pousser dans la branche gh-pages du projet. Ce script ne contient qu’une tâche: le déploiement du site de documentation est directement exécuté par pkgdown. Son succès est affiché par un badge à afficher dans le fichier README.md (voir section 6.4) Des scripts plus complexes sont proposés par R-lib111, notamment pour exécuter les tests sur plusieurs systèmes d’exploitation et plusieurs versions de R. Ces tests poussés sont à effectuer avant de soumettre à CRAN (section 5.10) mais consomment trop de ressource pour un usage systématique. 6.4 Ajouter des badges Le succès des Actions GitHub est visible en ajoutant un badge dans le fichier README.md, juste après le titre du fichier. Sur la page du projet, choisir “Actions” puis sélectionner l’action (dans “Workflows”). Cliquer sur le bouton “…” puis sur “Create Status Badge”. Coller le code Markdown: # Nom du projet ![bookdown](https://github.com/<GitHubID>/<Depot>/workflows/<NomDuFlux>/badge.svg) Le nom du flux a été déclaré dans l’entrée name: du fichier de configuration des actions GitHub. Le taux de couverture mesuré par Codecov peut aussi être affiché par un badge: [![codecov](https://codecov.io/github/<GitHubID>/ <Depot>/branch/master/graphs/badge.svg)] (https://codecov.io/github/<GitHubID>/<Depot>) https://travis-ci.org/↩︎ https://codecov.io/↩︎ https://github.com/EricMarcon/travailleR/blob/master/.github/workflows/bookdown.yml↩︎ https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on↩︎ https://github.com/actions/↩︎ https://github.com/r-lib/↩︎ https://stackoverflow.com/questions/46080853/why-does-rendering-a-pdf-from-rmarkdown-require-closing-rstudio-between-renders/46083308#46083308↩︎ https://EricMarcon.github.io/fr/publication/↩︎ https://github.com/r-lib/actions/tree/master/examples#standard-ci-workflow↩︎ "],["chap-shiny.html", "7 Shiny 7.1 Première application 7.2 Application plus élaborée 7.3 Hébergement", " 7 Shiny Shiny permet de publier sous la forme d’un site web une application interactive utilisant du code R. Le site peut fonctionner localement, sur le poste de travail d’un utilisateur qui le lance à partir de RStudio, ou en ligne, sur un serveur dédié exécutant Shiny Server112. De façon basique, un formulaire permet de saisir les arguments d’un fonction et une fenêtre de visualisation d’afficher les résultats du calcul. L’utilisation d’une application Shiny rend très simple l’exécution du code, y compris pour des utilisateurs étrangers à R, mais limite évidemment les possibilités. 7.1 Première application Dans RStudio, créer une application avec le menu “File > New File > Shiny Web App…”, saisir le nom de l’application “MonAppShiny” et sélectionner le dossier où la placer. Le nom de l’application a servi à créer un dossier qu’il faut maintenant transformer en projet (menu des projets en haut à droite de RStudio, “New Project > Existing Directory”, sélectionner le dossier de l’application). Le fichier de l’application nommé app.R contient deux fonctions: ui() qui définit l’interface graphique et server() qui contient le code R à exécuter. L’application peut être lancée en cliquant sur “Run App” dans la fenêtre du code. Figure 7.1: Application Shiny Old Faithful Geyser Data. La correspondance entre la fenêtre affichée (figure 7.1) et le code de la fonction ui() est simple à voir: le titre de l’application est affiché par la fonction titlePanel(); le curseur qui fixe le nombre de barres de l’histogramme est créé par sliderInput(); la fonction sidebarLayout() fixe la disposition des éléments de la page, sidebarPanel pour les contrôles de saisie et mainPanel() pour l’affichage du résultat. Le résultat est affiché par la fonction plotOutput() dont l’argument est le nom d’un élément de output, la variable remplie par la fonction server(). Toute modification d’un élément de l’interface, précisément d’un élément affiché par une fonction dont le nom se termine par Input() (il en existe pour tous les types d’entrées, par exemple textInput()) de Shiny provoque l’exécution de server() et la mise à jour des éléments de output. 7.2 Application plus élaborée 7.2.1 Méthode de travail Une application est créée en choisissant: une disposition de la fenêtre (layout); les contrôles de saisie des paramètres (intput); les contrôles d’affichage des résultats (output). Le code pour traiter les entrées et produire les sorties est ensuite écrit dans server(). Le tutoriel de RStudio113 est très détaillé et doit être utilisé pour aller plus loin. 7.2.2 Exemple Cette application simple utilise le package scholar pour interroger Google Scholar et obtenir les données bibliométriques d’un auteur à partir de son identifiant. Le fichier app.R contient tout le code et est construit progressivement ici. L’application complète, avec des sorties graphiques en plus de sa version simplifiée présentée ici est disponible sur GitHub114. Le début du code consiste à préparer l’exécution de l’application en chargeant les packages nécessaires: # Prepare the application #### # Load packages library("shiny") library("tidyverse") Le code de l’application complète intègre une fonction pour installer les packages manquants, à n’exécuter que quand l’application est exécutée sur un poste de travail (sur un serveur, la gestion des packages n’est pas du ressort de l’application). L’interface utilisateur est la suivante: # UI #### ui <- fluidPage( # Application title titlePanel("Bibliometrics"), sidebarLayout( sidebarPanel( helpText("Enter the Google Scholar ID of an author."), textInput("AuthorID", "Google Scholar ID", "4iLBmbUAAAAJ"), # End of input br(), # Display author's name and h uiOutput("name"), uiOutput("h") ), # Show plots in the main panel mainPanel( plotOutput("network"), plotOutput("citations") ) ) ) La fenêtre de l’application est fluide, c’est-à-dire qu’elle se réorganise seule quand sa taille varie, et est composée d’un panneau latéral (pour la saisie et l’affichage de texte) et d’un panneau principal, pour l’affichage de graphiques. Les éléments du panneau latéral sont: un texte d’aide: helpText(); un champ de texte à saisir, textInput(), dont les arguments sont le nom, le texte affiché, et la valeur par défaut (l’identifiant d’un auteur); un saut de ligne: br(); des contrôles de sortie au format HTML: uiOutput(), dont l’argument unique est le nom. Le panneau principal contient deux contrôles de sortie graphiques, plotOutput() dont l’argument est aussi le nom. Le code à exécuter pour traiter les entrées et produire les sorties est dans la fonction server(). # Server logic #### server <- function(input, output) { # Run the get_profile function only once #### # Store the author profile AuthorProfile <- reactiveVal() # Update it when input$AuthorID is changed observeEvent(input$AuthorID, AuthorProfile(get_profile(input$AuthorID))) # Output #### output$name <- renderUI({ h2(AuthorProfile()$name) }) output$h <- renderUI({ a(href = paste0( "https://scholar.google.com/citations?user=", input$AuthorID), paste("h index:", AuthorProfile()$h_index), target = "_blank" ) }) output$citations <- renderPlot({ get_citation_history(input$AuthorID) %>% ggplot(aes(year, cites)) + geom_segment(aes(xend = year, yend = 0), size = 1, color = 'darkgrey') + geom_point(size = 3, color = 'firebrick') + labs(title = "Citations per year", caption = "Source: Google Scholar") }) output$network <- renderPlot({ ggplot() + geom_blank() }) } Les informations nécessaires aux champs de sortie $name et $h (nom de l’auteur et indice h) sont obtenus par la fonction get_profile() du package scholar. Cette fonction interroge la page web Google Scholar de l’auteur et extrait les valeurs du résultat: c’est une traitement lourd, qu’il vaut mieux n’exécuter qu’une seule fois plutôt que deux, dans les fonctions renderUI() chargées de calculer les valeurs de output$h et output$name. Le code le plus simple pour le faire serait le suivant: # Run the get_profile function only once #### Store the # author profile AuthorProfile <- get_profile(input$AuthorID) La difficulté de la programmation d’une application Shiny est que tout calcul se référant à un élément de l’interface d’entrée doit être réactif. Si ce dernier code était exécuté, le message d’erreur suivant apparaît: “Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)”. En pratique, l’exécution du code est lancée par la modification d’un contrôle d’entrée (ici: intput$AuthorID). Le code faisant référence à un de ces contrôles doit être en permanence en attente d’une modification: il doit donc placé dans des fonctions particulières comme renderPlot dans l’application Old Faithful Geyser Data ou renderUI() ici. Le code suivant s’exécuterait sans erreur: # Output #### output$name <- renderUI({ AuthorProfile <- get_profile(input$AuthorID) h2(AuthorProfile$name) }) L’appel à la valeur du contrôle input$AuthorID a bien lieu dans une fonction réactive (mais get_profile() devrait être utilisé une deuxième fois dans le calcul de output$h, ce que nous voulons éviter). La fonction h2(AuthorProfile$name) produit du code HTML, un paragraphe de titre de niveau 2 dont la valeur est passée en argument. Toutes les fonctions dont le nom commence par render dans le package shiny sont réactives, et chacune est destinée à produire un type de sortie différent, par exemple du texte (renderText()) ou du code HTML (renderUI()). Si du code est nécessaire pour calculer des variables communes à plusieurs contrôles de sortie (output$name et output$h), il doit lui-même être réactif. Deux fonctions sont très utiles: observeEvent() surveille les changements d’un contrôle d’entrée et exécute du code quand ils se produisent; reactiveVal() permet de définir une variable réactive, qui sera modifiée par le code de observeEvent() et entraînera à son tour l’exécution d’autres fonctions réactives qui utilisent sa valeur. Le code optimal crée donc une variable réactive pour y stocker le résultat de l’interrogation de Google Scholar: # Store the author profile AuthorProfile <- reactiveVal() La variable réactive est vide à ce stade. Son utilisation est ensuite celle d’une fonction: AuthorProfile(x) lui attribue la valeur x et AuthorProfile(), sans argument, renvoie sa valeur. La fonction observeEvent() est déclenchée quand input$AuthorID est modifié et exécute le code passé en deuxième argument, ici la mise à jour de AuthorProfile. # Update it when input$AuthorID is changed observeEvent(input$AuthorID, AuthorProfile(get_profile(input$AuthorID))) Enfin, les fonctions renderUI() qui fournissent les valeurs des contrôles de sortie utilisent la valeur de AuthorProfile: # Output #### output$name <- renderUI({ h2(AuthorProfile()$name) }) Remarquer les parenthèses de AuthorProfile(), variable réactive, par opposition à la syntaxe AuthorProfile$name pour une variable classique. La valeur de output$h est un lien internet, <a href=... en HTML, écrit par la fonction a() du package htmltools utilisé par renderUI(). output$h <- renderUI({ a(href = paste0("https://scholar.google.com/citations?user=", input$AuthorID), paste("h index:", AuthorProfile()$h_index), target = "_blank") }) Le lien est vers la page Google Scholar de l’auteur. La valeur affichée est son indice h. L’argument target = \"_blank\" indique que le lien doit être ouvert dans une nouvelle fenêtre du navigateur. Le graphique output$citations est créé par la fonction réactive renderPlot(). Les données fournies par la fonction get_citation_history() de scholar (qui interroge l’API de Google Scholar) sont traitées par ggplot(). Enfin, le graphique output$network est un graphique vide dans cette version simplifiée de l’application. L’application complète reprend ce code en y ajoutant le traitement des erreurs dans le cas où le code de l’auteur n’existe par sur Google Scholar et le graphique du réseau des co-auteurs. 7.3 Hébergement Une application Shiny n’est pas forcément hébergée par un serveur web: elle peut être exécutée sur les postes de travail des utilisateurs s’ils disposent de R. Pour un usage plus large, un serveur dédié est nécessaire. Shinyapps.io115 est un service de RStudio qui permet d’héberger gratuitement 5 applications Shiny avec un temps de fonctionnement maximal de 5 heures par mois. Il faut tout d’abord ouvrir un compte sur le site, de préférence avec ses identifiants GitHub. Pour permettre la gestion des applications en ligne directement depuis RStudio, il faut installer ensuite le package rsconnect et le paramétrer: rsconnect::setAccountInfo(name = "prenom.nom", token = "xxx", secret = "<SECRET>") Le code exact, avec le nom d’utilisateur et le jeton à utiliser, sont affichés sur la page d’accueil de Shinyapps.io: cliquer sur “Show Secret”, copier le code et le coller dans la console de RStudio pour l’exécuter. Un bouton “Publish” est disponible juste à droite du bouton “Run App”. Cliquer dessus et valider la publication (figure 7.2). Figure 7.2: Publication de l’application Shiny sur Shinyapps.io. L’application est maintenant accessible à l’adresse https://prenom-nom.shinyapps.io/MonAppShiny/ L’application “Bibliometrics” ne fonctionne pas sur Shinyapps.io parce que la façon dont le package Scholar interroge Google Scholar n’est pas supportée. La plupart des applications Shiny fonctionnent sans difficulté, tant qu’elles ne nécessitent pas de fonctionnalités réseau complexes. https://rstudio.com/products/shiny/download-server/↩︎ https://shiny.rstudio.com/tutorial/↩︎ https://github.com/EricMarcon/bibliometrics↩︎ https://www.shinyapps.io/↩︎ "],["chap-enseigner.html", "8 Enseigner avec R 8.1 learnr 8.2 GitHub Classrooms", " 8 Enseigner avec R R, RStudio et GitHub fournissent des outils pour enseigner. Le package learnr permet de réaliser des tutoriels interactifs. On verra aussi comment utiliser les salles de classe GitHub (GitHub Classrooms) qui permettent de diffuser à une classe (une liste d’étudiants disposant d’un compte GitHub) un modèle de dépôt (un début de projet R) que chaque étudiant devra développer et publier. Les outils de la salle de classe permettent d’évaluer le travail fourni assez simplement. 8.1 learnr learnr permet de rendre interactifs les bouts de code de n’importe quel document produit par R Markdown en HTML, en les transformant en applications Shiny. La documentation sur le site de RStudio116 est très claire et ne sera pas reprise ici: nous verrons seulement comment commencer et comment diffuser les tutoriels. 8.1.1 Premier tutoriel Utiliser comme pour tous les documents le menu “File > New File > RMarkdown…” et créer un nouveau document à partir d’un modèle “Interactive Tutorial”. L’assistant crée un dossier du nom choisi, à transformer en projet R et passer sous contrôle de source, comme pour tous les documents vus précédemment (voir section 4.3.2). Pour exécuter le tutoriel, cliquer sur le bouton “Run Document” qui se trouve à place habituelle du bouton “Tricoter”. Les tutoriels peuvent inclure des exercices, qui sont des bouts de code avec l’option exercise=TRUE. Ces exercices sont affichés sous la forme d’une fenêtre de code modifiable et exécutable par l’utilisateur. Des indices peuvent être donnés117, un bouton ajouté pour afficher la solution, une limite de temps peut être fixée118, et le code comme son résultat peuvent être comparés à une valeur attendue119. Des quizz120 peuvent être ajoutés, sous la forme de questionnaires à choix multiples ou uniques. La progression de l’utilisateur dans le tutoriel (code saisi, réponses aux questions…) est sauvegardée par learnr sur le poste de travail. Un tutoriel peut être arrêté puis repris sans perte de données. En revanche, il n’y a pas de moyen simple de récupérer ces données pour une évaluation par le formateur par exemple. 8.1.2 Diffusion Les tutoriels peuvent être diffusés en copiant les fichiers ou en indiquant aux utilisateurs de cloner les projets GitHub qui les contiennent. Ils peuvent aussi être hébergés sur Shinyapps.io (voir section 7.3). Enfin, ils peuvent être inclus dans un package121. 8.2 GitHub Classrooms GitHub Classrooms permet de diffuser à un public étudiant des dépôts GitHub à modifier et de contrôler le résultat. Les applications sont aussi bien l’apprentissage de R que la production de documents, pour un travail personnel ou un examen par exemple. 8.2.1 Inscription Pour commencer à utiliser l’outil, il faut ouvrir un compte. Sur le site de GitHub Classrooms122, cliquer sur “Sign in” et utiliser son compte GitHub pour s’authentifier. 8.2.2 Organisations L’étape suivant consiste à créer une organisation GitHub. Une organisation GitHub contient essentiellement des membres (titulaires d’un compte GitHub) et des dépôts accessibles à l’adresse https://github.com/Organisation/Depot. La façon la plus simple de travailler consiste à créer une organisation par cours mais d’autres approches sont possibles dans des structures utilisant intensivement l’outil. L’organisation crée pour l’exemple est ici “Cours-R”123. Une adresse de messagerie est nécessaire (utiliser la même que celle de son compte GitHub) et l’organisation doit être déclarée comme appartenant à son compte personnel. Si l’organisation n’est pas visible sur la page de GitHub Classrooms, cliquer sur “Grant us access”. 8.2.3 Nouvelle salle de classe Une salle de classe (classroom) est peuplée d’étudiants qui recevront des tâches (assignments) à exécuter. Cliquer sur New Classroom. Sélectionner l’organisation en charge de l’administration de la salle de classe. Saisir le nom de la salle de classe: une bonne pratique est de la préfixer par le nom du cours et d’ajouter le nom de la session, par exemple “Cours-R-2020-EdGuyane”. Ne pas ajouter de collaborateurs (ce sera possible plus tard), et saisir éventuellement la liste des étudiants (un nom par ligne, possible plus tard aussi). La classe est créée. Toutes les salles de classe sont visibles depuis la page d’accueil de GitHub Classrooms124. Cliquer sur un nom pour en ouvrir une. Le bouton “Settings” permet de changer son nom ou de la supprimer. Le bouton “TAs and Admins” permet d’ajouter des collaborateurs, c’est-à-dire d’autres utilisateurs GitHub qui pourront administrer la salle de classe. Le bouton “Students” permet d’ajouter des étudiants. La liste de nom est libre, sans format obligatoire. Cliquer sur “Create Roster” pour l’activer. Les noms doivent ensuite être liés à des comptes GitHub: ce travail peut être fait par l’administrateur ou par les étudiants eux-mêmes quand ils recevront la première tâche à effectuer. Chaque étudiant doit avoir un compte sur GitHub. 8.2.4 Préparer un modèle de dépôt Une tâche est un dépôt GitHub à modifier. Par exemple125, créer un dépôt contenant un projet R avec un fichier Markdown décrivant le travail à faire et éventuellement une partie du code nécessaire pour y parvenir, les autres fichiers du modèle R Markdown utilisé et un fichier de données. Si le modèle est par exemple Memo (section 4.3.2), le script GitHubPages.R est fourni. Ouvrir les propriétés du dépôt sur GitHub et cocher la case Template Repository pour en faire un modèle. 8.2.4.1 Assigner une tâche Ouvrir une salle de classe et cliquer sur “New Assignment”. Saisir un titre explicite pour les étudiants, une date limite optionnelle et choisir “Individual Assignment”. Par défaut, le nom de la tâche sert de préfixe pour le nom des dépôts des étudiants mais il peut être remplacé par un préfixe choisi. Quand les étudiants rendront leur travail, tous les dépôts de toutes les tâches seront stockés dans l’organisation. Le dépôt crée sur le compte de chaque étudiant peut être privé ou public, selon que l’on souhaite que les étudiants puissent voir le travail des autres ou non. Donner le droit d’administration et rendre le site public si les étudiants doivent pouvoir activer les pages GitHub pour présenter le résultat de leur travail. Cliquer sur “Continue”. Sélectionner le dépôt modèle (starter code) puis cliquer sur “Continue” puis “Create Assignment”. La nouvelle tâche est créée. Elle est associée à un lien d’invitation qu’il faut copier et envoyer aux étudiants. Quand ils cliqueront sur le lien, ils atteindront une page GitHub qui leur permettra d’associer leur compte à un nom de la liste (aucun contrôle n’est possible: le premier connecté peut s’associer à n’importe quel nom). Ils pourront ensuite créer un nouveau projet RStudio à partir du dépôt GitHub créé automatiquement par GitHub Classrooms, modifier ce projet selon les consignes de travail et le pousser sur GitHub. Le dépôt se trouve sur le compte de l’organisation à laquelle la classe est reliée, et est suffixé par l’identifiant GitHub de l’étudiant. 8.2.4.2 Contrôler le travail des étudiants Il est possible d’afficher chaque dépôt crée par les étudiants à partir de la page de la tâche sur GitHub Classrooms. Si le travail à produire est un document rédigé, demander aux étudiants de le placer dans les pages GitHub du dépôt pour le lire directement en ligne. L’assistant GitHub Classrooms126 permet de télécharger en une fois tous les dépôts des étudiants pour les corriger sur son poste de travail. https://rstudio.github.io/learnr/↩︎ https://rstudio.github.io/learnr/exercises.html#Hints_and_Solutions↩︎ https://rstudio.github.io/learnr/exercises.html#Time_Limits↩︎ https://rstudio.github.io/learnr/exercises.html#Exercise_Checking↩︎ https://rstudio.github.io/learnr/questions.html↩︎ https://rstudio.github.io/learnr/publishing.html#R_Package↩︎ https://classroom.github.com/↩︎ https://github.com/Cours-R↩︎ https://classroom.github.com/classrooms↩︎ https://github.com/EricMarcon/Cours-R-Memo/settings↩︎ https://classroom.github.com/assistant↩︎ "],["chap-conclusion.html", "9 Conclusion", " 9 Conclusion L’environnement de travail de R et RStudio permet de produire tous types de documents avec un langage unique. L’objectif de reproductibilité des résultats est atteint en intégrant les traitements statistiques et la rédaction. Le travail collaboratif est permis par l’utilisation systématique du contrôle de source et de GitHub. La présentation des résultats est assurée par les pages GitHub et des modèles de documents couvrant la majorité des besoins. Pour les pauses, R fournit même quelques jeux dans le package fun, dont le célèbre démineur: # Installation du package install.packages("fun") # Ouverture d'une fenêtre X et exécution if (interactive()) { if (.Platform$OS.type == "windows") x11() else x11(type = "Xlib") fun::mine_sweeper() } Ce document n’a pas pour objectif d’être exhaustif sur les possibilités de R mais plutôt de présenter une méthode de travail et des moyens simples de l’appliquer rapidement. On se reportera aux ouvrages plus détaillés cités dans le texte pour approfondir tel ou tel point. Ce document est mis à jour régulièrement en fonction de l’évolution des outils disponibles. "],["references.html", "References", " References "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] +[["index.html", "Travailler avec R Présentation Objectifs Conventions", " Travailler avec R Eric Marcon 13/12/2021 Présentation Objectifs Ce document est le support du cours Travailler avec R. Il propose une organisation du travail autour de R et RStudio pour, au-delà des statistiques, rédiger des documents efficacement avec R Markdown, aux formats variés (mémos, articles scientifiques, mémoires d’étudiants, livres, diaporamas), créer son site web et des applications R en ligne (Shiny), produire des packages et utiliser R pour l’enseignement. Il complète Reproducible Research with R and R Studio (Gandrud 2015) par une approche plus concrète, avec des solutions prêtes à l’emploi. L’optimisation de l’utilisation des nombreux outils disponibles est traitée en détail: rmarkdown, bookdown et blogdown pour la rédaction, roxygen2, testthat et pkgdown pour les packages, le contrôle de source avec git et GitHub, l’intégration continue avec les Actions GitHub et Codecov. Des exemples sont présentés à chaque étape, et le code nécessaire est fourni. Le chapitre 1 est consacré à l’installation des outils nécessaires : R, git et LaTeX. Le chapitre 2 détaille quelques aspects avancés de l’utilisation de R: les différents langages, les environnements, la performance du code. L’utilisation de base de R n’est pas reprise ici: de bons cours sont suggérés. Le chapitre 3 présente le contrôle de source avec git et GitHub. Le chapitre 4 montre comment rédiger des documents simples (articles) ou complexes (ouvrages) avec R Markdown, intégrant les données, le code pour les traiter et le texte pour les présenter. Le chapitre 5 présente une méthode pas à pas pour créer efficacement un package. Le chapitre 6 introduit l’utilisation de l’intégration continue pour produire automatiquement des documents, vérifier le code des packages et produire leurs vignettes. Le chapitre 7 présente Shiny, l’outil de mise en ligne d’applications R. Enfin, le chapitre 8 introduit les outils destinés à l’enseignement de et avec R. Conventions Les noms des packages sont en gras dans le texte, exemple: ggplot2. L’identifiant utilisé sur GitHub est noté GitHubID. Le signe |> dans le code des exemples indique que la suite du code devrait se trouver sur la même ligne, mais est coupée pour le formatage de ce document. Son usage est limité aux fichiers de configuration YAML, surtout utilisés dans le chapitre 6. Dans tous les autres cas, le code peut être utilisé directement. References "],["chap-logiciels.html", "1 Logiciels 1.1 R 1.2 RStudio 1.3 Packages 1.4 git et GitHub 1.5 MiKTeX 1.6 Zotero 1.7 Go", " 1 Logiciels L’outil central est évidemment R, mais son fonctionnement est aujourd’hui difficilement envisageable sans son environnement de développement RStudio. Pour le contrôle de source, git et GitHub sont de fait les standards. L’ensemble doit être complété par une distribution LaTeX pour la production de documents au format PDF. Un outil de gestion bibliographique est indispensable: Zotero et son extension Better BibTeX sont parfaitement adaptés au cadre de travail présenté ici. Enfin, d’autres logiciels d’usage plus ponctuel peuvent être nécessaires, comme Go. Leur installation et leur organisation cohérente sont présentées dans ce chapitre. 1.1 R 1.1.1 Installation R est inclus dans les distributions de Linux: le paquet est nommé r-base. Il ne contient pas des outils de développement souvent nécessaires, donc il est préférable d’installer aussi le paquet r-base-dev. La version de R est souvent un peu ancienne. Pour disposer de la dernière version, il faut utiliser un miroir de CRAN comme source des paquets : voir la documentation complète pour Ubuntu1. Sous Windows ou Mac, installer R après l’avoir téléchargé depuis CRAN2. 1.1.2 Rtools Sur Mac, l’installation de R est suffisante à partir de la version 4.0.0. Sous Windows, l’installation doit être complétée par les “Rtools”, qui contiennent les outils de développement dont ceux nécessaires à la compilation des packages contenant du code C++. Le chemin des Rtools doit être déclaré à R, en exécutant dans la console de RStudio la commande suivante (adaptée à la version 4.0 des Rtools): # Rtools : déclaration du chemin, # nécessite de redémarrer RStudio writeLines('PATH="${RTOOLS40_HOME}\\\\usr\\\\bin;${PATH}"', con = "~/.Renviron") Les Rtools doivent être complétés par quelques utilitaires manquants, à installer quand le besoin apparaît (en général, un avertissement de R indiquant que le logiciel n’est pas installé). La vérification des packages renvoie un avertissement si qpdf3 n’est pas installé. Télécharger le fichier zip et coller tout le contenu du dossier bin dans le dossier usr/bin de Rtools (C:\\Rtools40\\usr\\bin pour la version 4.0). Un autre avertissement est renvoyé en absence de Ghostscript4 à télécharger et installer. Copier ensuite le contenu du dossier bin dans le dossier usr/bin de Rtools. 1.1.3 Mise à jour Il est conseillé d’utiliser la dernière version mineure de R: par exemple, 4.0.x jusqu’à la sortie de la version 4.1. Il est obligatoire d’utiliser la toute dernière version pour préparer un package soumis à CRAN. Des changements importants ont lieu entre les versions majeures (la version 4 ne permet pas d’utiliser un package compilé pour la version 3) mais aussi parfois entre versions mineures (un fichier de données binaires .rda enregistré sous la version 3.3 ne peut pas être lu par la version 3.6). Il est donc utile de mettre R à jour régulièrement. L’installation d’une nouvelle version ne désinstalle par automatiquement les versions anciennes, ce qui permet d’en utiliser plusieurs en cas de besoin (par exemple, si un package ancien et indispensable n’est plus disponible). En usage courant, il est préférable de désinstaller manuellement les anciennes versions après l’installation d’une nouvelle. 1.1.4 Librairies Les packages de R se trouvent dans deux dossiers: la bibliothèque système (System Library) contient les packages fournis avec R : base, utils, graphics par exemple. Elle se trouve dans un sous-répertoire du programme d’installation (C:\\Program Files\\R\\R-4.0.0\\library pour R version 4.0.0 sous Windows 10). La bibliothèque utilisateur (User Library) contient ceux installés par l’utilisateur. Elle se trouve dans le dossier personnel de l’utilisateur, dans un sous-dossier R\\win-library\\4.0\\). Si le dossier personnel de l’utilisateur est sauvegardé (par exemple, s’il est répliqué dans le cloud par OneDrive sous Windows), il n’est pas optimal d’y placer les packages: le trafic généré par leur sauvegarde serait lourd et inutile. Pour que les packages soient installés automatiquement dans la bibliothèque système, il suffit que l’utilisateur y ait le droit d’écrire. Sous Windows, donner le droit “Modifier” au groupe des utilisateurs de l’ordinateur sur le dossier de la bibliothèque, en plus du droit de lecture par défaut 1.1). Figure 1.1: Activation du droit de modifier la bibliothèque système sous Windows. Si la bibliothèque utilisateur est retenue, il faut penser à vider le dossier correspondant à l’ancienne version de R en cas changement de version mineure. L’emplacement des librairies est donné par la fonction .libPaths(): .libPaths() ## [1] "/Users/runner/work/_temp/Library" ## [2] "/Library/Frameworks/R.framework/Versions/4.1/Resources/library" 1.2 RStudio RStudio est une interface graphique pour R et bien plus: il est conçu pour simplifier la gestion des projets, faciliter la rédaction et la production de documents et intégrer le contrôle de source par exemple. 1.2.1 Installation Installer la dernière version de RStudio Desktop à partir du site de RStudio5. Une commande est disponible dans le menu “Help” de RStudio pour vérifier l’existence d’une version plus récente, à installer. 1.2.2 Encodage des fichiers Les fichiers manipulés dans R sont très majoritairement des fichiers texte. Les caractères spéciaux, notamment les accents, peuvent être codés de diverses façons mais la déclaration du codage n’est pas intégrée aux fichiers. Le codage par défaut dépend du système d’exploitation, ce qui pose régulièrement des problèmes de lisibilité des fichiers partagés. Le codage UTF8 est devenu le standard parce qu’il est universellement reconnu et supporte tous les alphabets sans ambiguïtés. Dès la première utilisation de RStudio, créer un nouveau fichier R (menu “File > New File > R Script”), l’enregistrer au format UTF8 (“File > Save with Encoding…”), choisir UTF8 dans la liste des formats et cocher la case “Set as default encoding for source files”. Supprimer le fichier après l’avoir enregistré. Les nouveaux fichiers seront codés au format UTF8. Les fichiers codés sous un autre format ne s’afficheront pas correctement: ils pourront être réouverts avec leur codage d’origine (“File > Reopen with Encoding…”), en essayant éventuellement plusieurs codages jusqu’à obtenir un affichage correct, et sauvegardés au format UTF8 ensuite. 1.2.3 Dossier de travail Le dossier de travail par défaut est le dossier personnel de l’utilisateur, appelé ~ par RStudio: Sys.getenv("R_USER") ## [1] "" Mes Documents sous Windows; Home sous Mac ou Linux. Il faut systématiquement travailler dans des sous-dossiers de ~, par exemple : ~\\Formation. Pour le bon fonctionnement des RTools, le nom complet du répertoire de travail ne doit pas contenir d’espace (utiliser les tirets bas _) ni de caractère spécial. Le dossier de travail en cours est obtenu par la commande getwd(). getwd() ## [1] "/Users/runner/work/travailleR/travailleR" L’utilisation du contrôle de source (voir chapitre 3) crée de nombreux fichiers de travail. Les projets sous contrôle de source ne devraient pas se trouver dans un dossier déjà sauvegardé par un autre moyen, comme un lecteur OneDrive sous Windows, sous peine d’une utilisation excessive des ressources: chaque validation de modifications engendre la sauvegarde des fichiers modifiés, mais aussi des fichiers de contrôle qui peuvent être de grande taille. 1.2.4 Solution retenue L’organisation de l’environnement travail est une affaire personnelle, qui dépend des préférences de chacun. L’organisation proposée ici n’est qu’une possibilité, à adapter à ses propres choix, mais en respectant les contraintes mentionnées. Sous Windows, une organisation optimale est la suivante: Dans son dossier personnel (Mes Documents, ~ pour R), un dossier R est utilisé pour les projets simples, sans contrôle de source. La sauvegarde de ce dossier est gérée par ailleurs. Un dossier hors du dossier personnel est utilisé pour les projets sous contrôle de source. L’utilisateur doit y avoir le droit d’écrire. Dans l’organisation de Windows, le dossier correspondant à ces critères est %LOCALAPPDATA%, typiquement C:\\Users\\NomUtilisateur\\AppData\\Local. Le dossier sera donc %LOCALAPPDATA%\\ProjetsR à créer: exécuter md %LOCALAPPDATA%\\ProjetsR dans une invite de commande. Epingler ce dossier à l’accès rapide de l’explorateur de fichiers (figure 1.2): coller %LOCALAPPDATA%\\ProjetsR dans la barre d’adresse de l’explorateur de fichiers, valider, puis faire un clic droit sur “Accès Rapide” et épingler le dossier. Figure 1.2: Dossier pour les projets sous contrôle de source, sous Windows. 1.3 Packages 1.3.1 Installation depuis CRAN L’installation classique des packages fait appel à CRAN. Un bouton “Install” se trouve dans la fenêtre Packages de RStudio. Les packages sont déposés sur CRAN par leurs auteur sous forme de code source, compressé dans une fichier .tar.gz. Ils sont disponibles pour le téléchargement dès leur validation. Ils doivent ensuite être mis au format binaire pour Windows (dans un fichier .zip), ce qui prend un peu de temps. A la demande de l’installation d’un package sous Windows, CRAN propose la version source plutôt que la version binaire si elle est plus récente 1.3). Figure 1.3: Activation du droit de modifier la bibliothèque système sous Windows. La liste des packages concernés est affichée dans la console, par exemple: There are binary versions available but the source versions are later: binary source needs_compilation boot 1.3-24 1.3-25 FALSE class 7.3-16 7.3-17 TRUE Certains packages nécessitent une compilation (colonne needs_compilation), en général parce qu’ils contiennent du code C++. Ils ne pourront être installés que par les Rtools. L’installation des packages en version source est beaucoup plus longue qu’en version binaire. Sauf si une version précise d’un package est nécessaire, il est donc préférable de refuser l’installation des versions source. Les packages peuvent être mis à jour un peu plus tard, après leur compilation par CRAN. Le bouton “Update” dans la fenêtre Packages de RStudio permet de mettre à jour tous les packages installés. 1.3.2 Installation depuis GitHub Certains packages ne sont pas disponibles sur CRAN mais seulement sur GitHub parce qu’ils sont encore en développement ou parce qu’ils ne sont pas destinés à un large usage par la communauté des utilisateurs de R. Il peut aussi être utile d’installer une version de développement d’un package publié sur CRAN pour un usage ponctuel comme le test de nouvelles fonctionnalités. L’installation est gérée par le package remotes. L’argument build_vignettes est nécessaire pour créer les vignettes du package. remotes::install_github("EricMarcon/memoiR", build_vignettes = TRUE) Le nom du package est entré sous la forme “GitHubID/NomduPackage”. L’installation est faite à partir du code source et nécessite donc les Rtools si une compilation est nécessaire. install_github() vérifie que la version sur GitHub est plus récente que l’éventuelle version installée sur le poste de travail et ne fait rien si elles sont identiques. 1.3.3 Installation depuis Bioconductor Bioconductor est une plateforme complémentaire de CRAN qui héberge des packages spécialisés dans la génomique. L’installation des packages de Bioconductor nécessite le package BiocManager pour sa fonction install(). Le premier argument de la fonction est un vecteur de caractères contenant les noms des packages à installer, par exemple: BiocManager::install(c("GenomicFeatures", "AnnotationDbi")) La fonction install() appelée sans arguments met à jour les packages. 1.3.4 Solution retenue A chaque mise à jour mineure de R, tous les packages doivent être réinstallés. La façon la plus efficace de le faire est de créer un script Packages.R à placer dans ~\\R. Il contient une fonction qui vérifie si chaque package est déjà installé pour ne pas le refaire inutilement. # Installation des packages de R #### # Installer les packages si nécessaire #### InstallPackages <- function(Packages) { sapply(Packages, function(Package) if (!Package %in% installed.packages()[, 1]) {install.packages(Package)}) } # Outils de développement #### InstallPackages(c( # Outils de développement. Importe remotes, etc. "devtools", # Exécution de Check par RStudio "rcmdcheck", # Formatage du code R (utilisé par knitr) "formatR", # Documentation des packages dans /docs sur GitHub "pkgdown", # Bibliographie avec roxygen "Rdpack", # Mesure des performances "rbenchmark", # Documentation automatique des packages "roxygen2", # Tests des packages "testthat" )) # Markdown #### InstallPackages(c( # Tricot "knitr", # Documents markdown complexes "bookdown", # Sites web "blogdown", # Modèles de documents "memoiR" )) # Tidyverse #### InstallPackages("tidyverse") # Mes packages #### # EcoFoG remotes::install_github("EcoFoG/EcoFoG", build_vignettes = TRUE) La dernière partie du script est à compléter avec les packages utilisés régulièrement. Ce script est à exécuter à chaque mise à jour de R, après avoir éventuellement activé le droit d’écriture dans la librairie système (voir section 1.1.4). 1.4 git et GitHub 1.4.1 git git est le logiciel de contrôle de source utilisé ici. Son utilisation est détaillée dans le chapitre 3. Pour Windows et Mac, l’installation a lieu à partir du site web de git6. git est intégré dans les distributions Linux. Pour Ubuntu, le package apt est git-all. git est installé sans interface graphique, fournie par RStudio. Dans RStudio, modifier les options globales (menu “Tools > Global Options…”). Sélectionner Terminal et l’option New Terminals open with: GitBash. Vérifier la bonne installation de git en tapant la commande git -h dans le terminal de RStudio: l’aide doit s’afficher. Après l’installation de git, il est possible que le terminal de RStudio ne fonctionne plus correctement et renvoie un message d’erreur contenant les éléments suivants: *** fatal error - cygheap base mismatch detected This problem is probably due to using incompatible versions of the cygwin DLL. Le message d’erreur est imprécis: la librairie qui ne doit exister qu’en un seul exemplaire n’est pas cygwin1.dll mais msys-2.0.dll. Rechercher ce fichier dans les dossier d’installation de git et de Rtools. Ils se trouvent normalement dans usr/bin. Remplacer celui de git par celui de Rtools: la version des deux fichiers doit être identique. Entrer ses informations d’identification en exécutant les commandes suivantes dans le terminal: git config user.name git config user.email Le nom d’utilisateur est libre, de préférence “Prénom Nom”. 1.4.2 GitHub GitHub est la plateforme accessible par un site web qui permet de partager le contenu des dépôts git. Pour l’utiliser, il suffit d’ouvrir un compte avec la même adresse de messagerie que celle enregistrée dans git. Le nom du compte GitHub est noté ici GitHubID. Chaque compte GitHub permet d’héberger des dépôts (un dépôt contient les fichiers d’un projet) à l’adresse https://github.com/GitHubID/NomDuDepot7. Chaque dépôt peut disposer d’un site web à l’adresse https://GitHubID.github.io/NomDuDepot/8. Enfin, un site web global est prévu pour chaque utilisateur à l’adresse https://GitHubID.github.io/9. 1.4.3 Authentification SSH La communication entre git (installé sur l’ordinateur local) et GitHub (plateforme en ligne) nécessite de s’authentifier. Deux méthodes sont disponibles: HTTPS (aussi appelée SSL) et SSH. SSH est la plus robuste mais nécessite la création d’une clé privée. Dans le terminal de RStudio, exécuter: ssh-keygen -t ed25519 -C "user.email" L’adresse de messagerie doit être celle enregistrée dans la configuration de git et le compte GitHub. La clé est enregistrée dans le dossier .ssh du répertoire personnel de l’utilisateur. Il est possible d’ajouter un mot de passe (passphrase) à la clé, qui devra être tapé à la première utilisation de chaque session de travail. Si l’ordinateur est correctement sécurisé (pas d’accès physique par des tiers), la laisser vide permet de gagner en fluidité. Attention: la clé privée est strictement confidentielle et ne doit être copiée nulle part où elle pourrait être lue par un tiers (attention aux sauvegardes automatiques notamment). Elle n’a pas besoin d’être bien sauvegardée: en cas de perte, elle sera remplacée facilement. Dans le dossier .ssh, deux fichiers sont créés: l’un contient la clé privée, l’autre, avec l’extension .pub, la clé publique correspondante. Ouvrir le second avec un éditeur de texte et copier la clé publique dans le presse-papier. Sur GitHub, afficher les réglages de son compte (menu “Settings”), sélectionner “SSH and GPG Keys”, cliquer sur “New SSH Key” et coller la clé dans le champ “Key”. Donner un nom à la clé dans le champ “Title”. Le nom peut être celui de l’ordinateur sur lequel la clé a été créée. La clé ne doit pas être copiée sur plusieurs ordinateurs: en cas de besoin, créer une nouvelle clé sur chaque poste de travail utilisé. Dans le terminal de RStudio, vérifier le bon fonctionnement de la clé: ssh -T git@github.com Un message indique que l’authenticité du serveur GitHub ne peut pas être vérifiée: un contrôle manuel est nécessaire pour la première connexion. Vérifier auprès de GitHub que l’empreinte du serveur est correcte10 et taper yes. Le serveur est ajouté automatiquement à la liste des serveurs connus, dans le fichier known_hosts. Si la clé est compromise (perte ou prêt de l’ordinateur qui la contient), la supprimer sur GitHub et en créer une nouvelle. 1.4.4 Obtention d’un jeton d’accès personnel L’authentification HTTPS est l’alternative à l’authentification SSL: il faut choisir une méthode et s’y tenir par la suite. Pour utiliser l’authentification HTTPS, la création d’un jeton d’accès personnel est nécessaire. Les jetons sont créés sur GitHub, dans les paramètres de son compte d’utilisateur, dans “Developer Settings > Personal Access Tokens”11. Générer un nouveau jeton, le décrire en tant que “git-RStudio” et lui donner l’autorisation “repo”, c’est-à-dire modifier tous les dépôts (il n’est pas possible de limiter l’accès à un dépôt particulier). Le jeton est une chaîne de caractère qui ne pourra pas être relue plus tard: elle doit être sauvegardée comme un mot de passe. 1.5 MiKTeX Pour produire des documents au format PDF, une distribution Latex est nécessaire. La solution légère consiste à installer le package tinytex: sa fonction install_tinytex() installe une distribution LaTeX optimisée pour R Markdown. Une distribution complète est préférée ici parce qu’elle permet l’utilisation de Latex au-delà de RStudio. MiKTeX12 est une très bonne solution pour Windows et Mac. 1.5.1 Installation Télécharger le fichier d’installation et l’exécuter. Plusieurs choix sont à faire pendant l’installation: Installer le programme pour tous les utilisateurs (avec des droits d’administrateur); Le format par défaut du papier: choisir A4; Le mode d’installation des packages manquants: choisir “Always Install” pour qu’ils soient téléchargés automatiquement en cas de besoin. Pour Linux, suivre les instructions sur le site de MiKTeX. 1.5.2 Mises à jour MiKTeX est installé avec les packages LaTeX les plus utilisés. Si un document nécessite un package manquant, il est chargé automatiquement. Les mises à jour de packages doivent être faites périodiquement avec la console MiKTeX, accessible dans le menu Démarrer. Quand elle est lancée sans élévation des privilèges, la console propose de passer en mode administrateur. Cliquer sur “Switch to Administrator mode”. Dans les paramètres (Settings), vérifier que les packages s’installent toujours automatiquement et que le format du papier est bien A4. Dans le menu des mises à jour (Updates), cliquer sur “Check for updates” puis “Update now”. Si l’installation automatique est défaillante, il est possible d’installer manuellement un package dans le menu “Packages”. 1.6 Zotero Zotero13 est le logiciel de gestion bibliographique le plus utilisé. Ses extensions permettent de compléter ses fonctionnalités selon les besoins de chacun. Better BibTeX permet d’exporter et de maintenir à jour une sélection des références bibliographiques (une collection de Zotero) sous la forme d’un fichier BibTeX dans un projet R, où il pourra être utilisé dans la rédaction de documents ou la documentation de packages. Télécharger le fichier d’installation et l’exécuter. Créer un compte utilisateur sur le site web de Zotero. Lier l’installation locale au compte: dans le menu “Edition > Préférences”, sélectionner “Synchronisation > Paramètres” et s’authentifier dans la zone “Synchronisation des données”. Cocher ensuite la case “Synchroniser automatiquement” mais pas “Synchroniser le texte intégral des pièces jointes indexées” parce que la taille totale des textes intégraux synchronisés de cette manière entre le compte Zotero en ligne et le poste de travail est limitée à 300 Mo. Télécharger l’extension Better BibTeX14 et l’installer avec le menu “Outils > Extensions”: cliquer sur le bouton des paramètres en haut à droite de la fenêtre, puis “Install Add-on From File…” et sélectionner le fichier qui vient d’être téléchargé. Paramétrer Better BibTeX à partir du menu “Edition > Préférences > Better BibTeX”. Les options à modifier sont les suivantes: “Clés de citation > Format de clé”: [auth:capitalize][year] pour que les citations disposent d’un identifiant unique de la forme “Nom2021”; “Clés de citation > Conserver les clés de citation unique dans”: “Toutes les collections” pour que les identifiants des citations ne soient pas ambigus. “Exportation > Gestion des Champs > Champs à exclure de l’exportation”: “abstract, file” pour ne pas générer des fichiers bibliographiques surchargés d’informations inutiles dans les projets R. Il est conseillé d’utiliser l’extension ZotFile15 pour mieux contrôler l’emplacement du texte intégral (les fichiers PDF liés au références bibliographiques). L’installer puis la paramétrer dans “Outils > Préférences de ZotFile…> Paramètres généraux > Emplacement des fichiers > Dossier personnalisé”: choisir le dossier de stockage des textes intégraux. Si le dossier personnel de l’utilisateur est sauvegardé (par exemple, s’il est répliqué dans le cloud par OneDrive sous Windows), y placer ce dossier de stockage permet à la fois de sauvegarder les textes intégraux mais aussi d’y accéder à partir de plusieurs postes de travail ou directement en ligne. Cette solution est bien plus efficace que la synchronisation par défaut de Zotero, limitée en volume. 1.7 Go Go16 n’est utilisé que par le générateur de sites web Hugo (voir section 4.7). Télécharger le fichier d’installation et l’exécuter. A la fin de l’installation, exécuter la commande go version dans un terminal pour vérifier son bon fonctionnement. Les mises à jour se font en installant la nouvelle version par dessus la précédente. https://doc.ubuntu-fr.org/r↩︎ https://cran.r-project.org/↩︎ https://sourceforge.net/projects/qpdf/↩︎ https://www.ghostscript.com/↩︎ https://rstudio.com/products/rstudio/download/↩︎ https://git-scm.com/↩︎ Exemple: https://github.com/EricMarcon/travailleR↩︎ Exemple: https://EricMarcon.github.io/travailleR/↩︎ Exemple: https://EricMarcon.github.io/↩︎ https://docs.github.com/en/github/authenticating-to-github/githubs-ssh-key-fingerprints↩︎ https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line↩︎ https://miktex.org/download↩︎ https://www.zotero.org/↩︎ https://retorque.re/zotero-better-bibtex/installation/↩︎ http://zotfile.com/↩︎ https://golang.org/↩︎ "],["chap-utiliseR.html", "2 Utiliser R 2.1 Les langages de R 2.2 Environnements 2.3 Mesure du temps d’exécution 2.4 Boucles 2.5 Code C++ 2.6 Paralléliser R 2.7 Etude de cas 2.8 Flux de travail", " 2 Utiliser R La documentation consacrée à l’apprentissage de R est florissante. Les ouvrages suivants sont une sélection arbitraire mais utile pour progresser: L’Introduction à R et au tidyverse (Barnier 2020) est un excellent cours de prise en main. Advanced R (Wickham 2014) est la référence pour maîtriser les subtilités du langage et bien comprendre le fonctionnement de R. R for Data Science (Wickham et Grolemund 2016) présente une méthode de travail complète, cohérente avec le tidyverse. Enfin, Efficient R programming (Gillespie et Lovelace 2016) traite de l’optimisation du code. Quelques aspects avancés du codage sont vus ici. Des précisions sur les différents langages de R sont utiles pour la création de packages. Les environnements sont présentés ensuite, pour la bonne compréhension de la recherche des objets appelés par le code. Enfin, l’optimisation des performances du code est traitée en détail (boucles, code C++ et parallélisation) et illustrée par une étude de cas. 2.1 Les langages de R R comprend plusieurs langages de programmation. Le plus courant est S3, mais ce n’est pas le seul17. 2.1.1 Base Le cœur de R est constitué des fonctions primitives et structures de données de base comme la fonction sum et les données de type matrix: pryr::otype(sum) ## [1] "base" typeof(sum) ## [1] "builtin" pryr::otype(matrix(1)) ## [1] "base" typeof(matrix(1)) ## [1] "double" Le package pryr permet d’afficher le langage dans lequel des objets sont définis. La fonction typeof() affiche le type de stockage interne des objets: la fonction sum() appartient au langage de base de R et est une fonction primitive (builtin); les éléments de la matrice numérique contenant un seul 1 sont des réels à double précision, et la matrice elle-même est définie dans le langage de base. Les fonctions primitives sont codées en C et sont très rapides. Elles sont toujours disponibles, quels que soient les packages chargés. Leur usage est donc à privilégier. 2.1.2 S3 S3 est le langage le plus utilisé, souvent le seul connu par les utilisateurs de R. C’est un langage orienté objet dans lequel les classes, c’est-à-dire le type des objets, sont déclaratives. MonPrenom <- "Eric" class(MonPrenom) <- "Prenom" La variable MonPrenom est ici de classe “Prenom” par une simple déclaration. Contrairement au fonctionnement d’un langage orienté objet classique18, les méthodes S3 sont liées aux fonctions, pas aux objets. # Affichage par défaut MonPrenom ## [1] "Eric" ## attr(,"class") ## [1] "Prenom" print.Prenom <- function(x) cat("Le prénom est", x) # Affichage modifié MonPrenom ## Le prénom est Eric Dans cet exemple, la méthode print() appliquée à la classe “Prenom” est modifiée. Dans un langage orienté objet classique, la méthode serait définie dans la classe Prenom. Dans R, les méthodes sont définies à partir de méthodes génériques. print est une méthode générique (“un générique”) déclaré dans base. pryr::otype(print) ## [1] "base" Son code se résume à une déclaration UseMethod(\"print\"): print ## function (x, ...) ## UseMethod("print") ## <bytecode: 0x7ffd8325eb48> ## <environment: namespace:base> Il existe beaucoup de méthodes S3 pour print: head(methods("print")) ## [1] "print.acf" "print.AES" ## [3] "print.all_vars" "print.anova" ## [5] "print.ansi_string" "print.ansi_style" Chacune s’applique à une classe. print.default est utilisée en dernier ressort et s’appuie sur le type de l’objet, pas sur sa classe S3. typeof(MonPrenom) ## [1] "character" pryr::otype(MonPrenom) ## [1] "S3" Un objet peut appartenir à plusieurs classes, ce qui permet une forme d’héritage des méthodes. Dans un langage orienté objet classique, l’héritage permet de définir des classes plus précises (“PrenomFrancais”) qui héritent de classes plus générales (“Prenom”) et bénéficient de cette façon de leurs méthodes sans avoir à les redéfinir. Dans R, l’héritage consiste simplement à déclarer un vecteur de classes de plus en plus larges pour un objet: # Définition des classes par un vecteur class(MonPrenom) <- c("PrenomFrancais", "Prenom") # Ecriture alternative, avec inherits() inherits(MonPrenom, what = "PrenomFrancais") ## [1] TRUE inherits(MonPrenom, what = "Prenom") ## [1] TRUE Le générique cherche une méthode pour chaque classe, dans l’ordre de leur déclaration. print.PrenomFrancais <- function(x) cat("Prénom français:", x) MonPrenom ## Prénom français: Eric En résumé, S3 est le langage courant de R. Presque tous les packages sont écrits en S3. Les génériques sont partout mais passent inaperçus, par exemple dans des packages: library("entropart") .S3methods(class = "SpeciesDistribution") ## [1] autoplot plot ## see '?methods' for accessing help and source code La fonction .S3methods() permet d’afficher toutes les méthodes disponibles pour une classe, par opposition à methods() qui affiche toutes les classes pour lesquelles la méthode passée en argument est définie. De nombreuses fonctions primitives de R sont des méthodes génériques. Utiliser l’aide help(InternalMethods) pour les découvrir. 2.1.3 S4 S4 est une évolution de S3 qui structure les classes pour se rapprocher d’un langage orienté objet classique: les classes doivent être définies explicitement, pas simplement déclarées; les attributs (c’est-à-dire les variables décrivant les objets), appelés slots, sont déclarés explicitement; le constructeur, c’est-à-dire la méthode qui crée un nouvelle instance d’une classe (c’est-à-dire une variable contenant un objet de la classe), est explicite. En reprenant l’exemple précédent, la syntaxe S4 est la suivante: # Définition de la classe Personne, avec ses slots setClass("Personne", slots = list(Nom = "character", Prenom = "character")) # Construction d'une instance Moi <- new("Personne", Nom = "Marcon", Prenom = "Eric") # Langage pryr::otype(Moi) ## [1] "S4" Les méthodes appartiennent toujours aux fonctions. Elles sont déclarées par la fonction setMethod(): setMethod("print", signature = "Personne", function(x, ...) { cat("La personne est:", x@Prenom, x@Nom) }) print(Moi) ## La personne est: Eric Marcon Les attributs sont appelés par la syntaxe variable@slot. En résumé, S4 est plus rigoureux que S3. Quelques packages sur CRAN : Matrix, sp, odbc… et beaucoup sur Bioconductor sont écrits en S4 mais le langage est maintenant clairement délaissé au profit de S3, notamment à cause du succès du tidyverse. 2.1.4 RC RC a été introduit dans R 2.12 (2010) avec le package methods. Les méthodes appartiennent aux classes, comme en C++: elles sont déclarées dans la classe et appelées à partir des objets. library("methods") # Déclaration de la classe PersonneRC <- setRefClass("PersonneRC", fields = list(Nom = "character", Prenom = "character"), methods = list(print = function() cat(Prenom, Nom))) # Constructeur MoiRC <- new("PersonneRC", Nom = "Marcon", Prenom ="Eric") # Langage pryr::otype(MoiRC) ## [1] "RC" # Appel de la méthode print MoiRC$print() ## Eric Marcon RC est un langage confidentiel, bien que ce soit le premier “vrai” langage orienté objet de R. 2.1.5 S6 S619 perfectionne RC mais n’est pas inclus dans R: il nécessite d’installer son package. Les attributs et les méthodes peuvent être publics ou privés. Une méthode initialize() est utilisée comme constructeur. library(R6) PersonneR6 <- R6Class("PersonneR6", public = list(Nom = "character", Prenom = "character", initialize = function(Nom = NA, Prenom = NA) { self$Nom <- Nom self$Prenom <- Prenom }, print = function() cat(self$Prenom, self$Nom))) MoiR6 <- PersonneR6$new(Nom = "Marcon", Prenom = "Eric") MoiR6$print() ## Eric Marcon S6 permet de programmer rigoureusement en objet mais est très peu utilisé. Les performances de S6 sont bien supérieures à celles de RC mais sont inférieures à celles de S320. La non-inclusion de R6 à R est montrée par pryr: pryr::otype(MoiR6) ## [1] "S3" 2.1.6 Tidyverse Le tidyverse est un ensemble de packages cohérents qui ont fait évoluer la façon de programmer R. L’ensemble des packages indispensables peut être chargé par le package tidyverse qui n’a pas d’autre utilité: library("tidyverse") Il ne s’agit pas d’un nouveau langage à proprement parler mais plutôt d’une extension de S3, avec de profondes modifications techniques, notamment l’évaluation non conventionnelle des expressions21, qu’il n’est pas essentiel de maîtriser en détail. Ses principes sont inscrits dans un manifeste22. Son apport le plus visible pour l’utilisateur sont l’enchaînement des commandes dans un flux (pipeline de code). En programmation standard, l’enchaînement des fonctions s’écrit par emboîtements successifs, ce qui en rend la lecture difficile, surtout quand des arguments sont nécessaires: # Logarithme de base 2 de la moyenne de 100 tirages # aléatoires dans une loi uniforme log(mean(runif(100)), base = 2) ## [1] -1.127903 Dans le tidyverse, les fonctions s’enchaînent, ce qui correspond souvent mieux à la réflexion du programmeur sur le traitement des données: # 100 tirages aléatoires dans une loi uniforme runif(100) %>% # Moyenne mean %>% # Logarithme log(base=2) ## [1] -0.9772102 Le tuyau %>% est un opérateur qui appelle la fonction suivante en lui passant comme premier argument le résultat de la fonction précédente. Les arguments supplémentaires sont passés normalement: pour la lisibilité du code, il est indispensable de les nommer. La plupart des fonctions de R sont utilisables sans difficultés dans le tidyverse bien qu’elles n’aient pas été prévues pour cela: il suffit que leur premier argument soit les données à traiter. Le pipeline ne permet de passer qu’une seule valeur à la fonction suivante, ce qui interdit les fonctions multidimensionnelles, de type f(x,y). La structure de données préférée est le tibble, qui est un dataframe amélioré: sa méthode print() est plus lisible, et il corrige quelques comportements non-intuitifs des dataframes, comme la conversion automatique en vecteurs des dataframes à une seule colonne. Les colonnes du dataframe ou du tibble permettent de passer autant de données que nécessaire. Enfin, la visualisation des données est prise en charge par ggplot2 qui s’appuie sur une grammaire des graphiques (Wickham 2010) solide sur le plan théorique. Schématiquement, un graphique est construit selon le modèle suivant: ggplot(data = <DATA>) + <GEOM_FUNCTION>( mapping = aes(<MAPPINGS>), stat = <STAT>, position = <POSITION> ) + <COORDINATE_FUNCTION> + <FACET_FUNCTION> les données sont obligatoirement un dataframe; la géométrie est le type de graphique choisi (points, lignes, histogrammes ou autre); l’esthétique (fonction aes()) désigne ce qui est représenté: c’est la correspondance entre les colonnes du dataframe et les éléments nécessaires à la géométrie; la statistique est le traitement appliqué aux données avant de les transmettre à la géométrie (souvent “identity”, c’est-à-dire aucune transformation mais “boxplot” pour une boîte à moustache). Les données peuvent être transformées par une fonction d’échelle, comme scale_y_log10(); la position est l’emplacement des objets sur le graphique (souvent “identity”; “stack” pour un histogramme empilé, “jitter” pour déplacer légèrement les points superposés dans un geom_point); les coordonnées définissent l’affichage du graphique (coord_fixed() pour ne pas déformer une carte par exemple) ; enfin, les facettes offrent la possibilité d’afficher plusieurs aspects des mêmes données en produisant un graphique par modalité d’une variable. L’ensemble formé par le pipeline et ggplot2 permet des traitements complexes dans un code lisible. La figure 2.1 montre le résultat du code suivant: # Données sur les diamants fournies par ggplot2 diamonds %>% # Ne conserver que les diamants de plus d'un demi-carat filter(carat > 0.5) %>% # Graphique : prix en fonction du poids ggplot(aes(x = carat, y = price)) + # Nuage de points geom_point() + # Echelle logarithmique scale_x_log10() + scale_y_log10() + # Régression linéaire geom_smooth(method = "lm") Figure 2.1: Prix des diamants en fonction de leur poids. Démonstration du code de ggplot2 combiné au traitement de données du tidyverse. Dans cette figure, deux géométries (nuage de points et régression linéaire) partagent la même esthétique (prix en fonction du poids en carats) qui est donc déclarée en amont, dans la fonction ggplot(). Le tidyverse est documenté en détail dans Wickham et Grolemund (2016) et ggplot2 dans Wickham (2017). 2.2 Environnements Les objets de R, données et fonctions, sont nommés. Comme R est modulaire, avec la possibilité de lui ajouter un nombre indéterminé de packages, il est très probable que des conflits de nom apparaissent. Pour les régler, R dispose d’un système rigoureux de précédence des noms: le code s’exécute dans un environnement défini, héritant d’environnements parents. 2.2.1 Organisation R démarre dans un environnement vide. Chaque package chargé crée un environnement fils pour former une pile des environnements, dont chaque nouvel élément est appelé “fils” du précédent, qui est son “parent”. La console se trouve dans l’environnement global, fils du dernier package chargé. search() ## [1] ".GlobalEnv" "package:R6" ## [3] "package:entropart" "package:forcats" ## [5] "package:stringr" "package:dplyr" ## [7] "package:purrr" "package:readr" ## [9] "package:tidyr" "package:tibble" ## [11] "package:ggplot2" "package:tidyverse" ## [13] "package:kableExtra" "package:stats" ## [15] "package:graphics" "package:grDevices" ## [17] "package:utils" "package:datasets" ## [19] "package:methods" "Autoloads" ## [21] "package:base" Le code d’une fonction appelée de la console s’exécute dans un environnement fils de l’environnement global: # Environnement actuel environment() ## <environment: R_GlobalEnv> # La fonction f affiche son environnement f <- function() environment() # Affichage de l'environnement de la fonction f() ## <environment: 0x7ffd8ea24010> # Environnement parent de celui de la fonction parent.env(f()) ## <environment: R_GlobalEnv> 2.2.2 Recherche La recherche des objets commence dans l’environnement local. S’il n’est pas trouvé, il est cherché dans l’environnement parent, puis dans le parent du parent, jusqu’à l’épuisement des environnements qui génère une erreur indiquant que l’objet n’a pas été trouvé. Exemple: # Variable q définie dans l'environnement global q <- "GlobalEnv" # Fonction définissant q dans son environnement qLocalFonction <- function() { q <- "Fonction" return(q) } # La variable locale est retournée qLocalFonction() ## [1] "Fonction" # Fonction (mal écrite) utilisant une variable qu'elle ne # définit pas qGlobalEnv <- function() { return(q) } # La variable de l'environnement global est retournée qGlobalEnv() ## [1] "GlobalEnv" # Suppression de cette variable rm(q) # La fonction base::q est retournée qGlobalEnv() ## function (save = "default", status = 0, runLast = TRUE) ## .Internal(quit(save, status, runLast)) ## <bytecode: 0x7ffd8dd166a0> ## <environment: namespace:base> La variable q est définie dans l’environnement global. La fonction qLocalFonction définit sa propre variable q. L’appel de la fonction retourne la valeur locale de la fonction parce qu’elle se trouve dans l’environnement de la fonction. La fonction qGlobalEnv retourne la variable q qu’elle ne définit pas localement. Elle la recherche donc dans son environnement parent et trouve la variable définie dans l’environnement global. En supprimant la variable de l’environnement global par rm(q), la fonction qGlobalEnv() parcourt la pile des environnements jusqu’à trouver un objet nommé q dans le package base, qui est la fonction permettant de quitter R. Elle aurait pu trouver un autre objet si un package contenant un objet q avait été chargé. Pour éviter ce comportement erratique, une fonction ne doit jamais appeler un objet non défini dans son propre environnement. 2.2.3 Espaces de nom des packages Il est temps de définir précisément ce que les packages rendent visible. Les packages contiennent des objets (fonctions et données) qu’ils exportent ou non. Ils sont habituellement appelés par la fonction library() qui effectue deux opérations: elle charge le package en mémoire, ce qui permet d’accéder à tous ses objets avec la syntaxe package::objet pour les objets exportés et package:::objet pour ceux qui ne le sont pas; elle attache ensuite le package, ce qui place son environnement en haut de la pile. Il est possible de détacher un package avec la fonction unloadNamespace() pour le retirer de la pile des environnements. Exemple: # entropart chargé et attaché library("entropart") # Est-il attaché ? isNamespaceLoaded("entropart") ## [1] TRUE # Pile des environnements search() ## [1] ".GlobalEnv" "package:R6" ## [3] "package:entropart" "package:forcats" ## [5] "package:stringr" "package:dplyr" ## [7] "package:purrr" "package:readr" ## [9] "package:tidyr" "package:tibble" ## [11] "package:ggplot2" "package:tidyverse" ## [13] "package:kableExtra" "package:stats" ## [15] "package:graphics" "package:grDevices" ## [17] "package:utils" "package:datasets" ## [19] "package:methods" "Autoloads" ## [21] "package:base" # Diversity(), une fonction exportée par entropart est # trouvée Diversity(1, CheckArguments = FALSE) ## None ## 1 # Détacher et décharger entropart unloadNamespace("entropart") # Est-il attaché ? isNamespaceLoaded("entropart") ## [1] FALSE # Pile des environnements, sans entropart search() ## [1] ".GlobalEnv" "package:R6" ## [3] "package:forcats" "package:stringr" ## [5] "package:dplyr" "package:purrr" ## [7] "package:readr" "package:tidyr" ## [9] "package:tibble" "package:ggplot2" ## [11] "package:tidyverse" "package:kableExtra" ## [13] "package:stats" "package:graphics" ## [15] "package:grDevices" "package:utils" ## [17] "package:datasets" "package:methods" ## [19] "Autoloads" "package:base" # Diversity() est introuvable tryCatch(Diversity(1), error = function(e) print(e)) ## <simpleError in Diversity(1): could not find function "Diversity"> # mais peut être appelée avec son nom complet entropart::Diversity(1, CheckArguments = FALSE) ## None ## 1 L’appel de entropart::Diversity() charge le package (c’est-à-dire, exécute implicitement loadNamespace(\"entropart\")) mais ne l’attache pas. En pratique, il faut limiter le nombre de package attachés pour limiter le risque d’appeler une fonction non désirée, homonyme de la fonction recherchée. Dans les cas critiques, il faut utiliser le nom complet de la fonction: package::fonction(). Un problème fréquent concerne la filter() de dplyr homonyme de celle de stats. Le package stats est habituellement chargé avant dplyr, un package du tidyverse. stats::filter() doit donc être appelée explicitement. Cependant, le package dplyr ou tidyverse (qui attache tous les packages du tidyverse) peut être chargé systématiquement en créant un fichier .RProfile à la racine du projet contenant la commande: library("tidyverse") Dans ce cas, dplyr est chargé avant stats et c’est sa fonction qui est inaccessible. 2.3 Mesure du temps d’exécution Le temps d’exécution d’un code long peut être mesuré très simplement par la commande system.time. Pour des temps d’exécution très courts, il est nécessaire de répéter la mesure: c’est l’objet du package microbenchmark. 2.3.1 system.time La fonction retourne le temps d’exécution du code. # Ecart absolu moyen de 1000 valeurs dans une loi uniforme, # répété 100 fois system.time(for (i in 1:100) mad(runif(1000))) ## user system elapsed ## 0.021 0.001 0.031 2.3.2 microbenchmark Le package microbenchmark est le plus avancé. L’objectif est de comparer la vitesse du calcul du carré d’un vecteur (ou d’un nombre) en le multipliant par lui-même (\\(x \\times x\\)) ou en l’élevant à la puissance 2 (\\(x^2\\)). # Fonctions à tester f1 <- function(x) x * x f2 <- function(x) x^2 f3 <- function(x) x^2.1 f4 <- function(x) x^3 # Initialisation X <- rnorm(10000) # Test library("microbenchmark") (mb <- microbenchmark(f1(X), f2(X), f3(X), f4(X))) ## Unit: microseconds ## expr min lq mean median uq ## f1(X) 37.181 39.6745 64.86077 41.3755 46.1415 ## f2(X) 45.370 47.5030 65.27954 48.7135 53.7015 ## f3(X) 277.136 279.5660 324.77873 283.8920 294.9715 ## f4(X) 407.486 411.9225 449.52333 417.5475 432.4040 ## max neval ## 1602.155 100 ## 1441.242 100 ## 2153.031 100 ## 2005.643 100 Le tableau retourné contient les temps minimum, médian, moyen, max et les premiers et troisièmes quartiles, ainsi que le nombre de répétitions. La valeur médiane est à comparer. Le nombre de répétition est par défaut de 100, à moduler (argument times) en fonction de la complexité du calcul. Le résultat du test, un objet de type microbenchmark, est un tableau brut des temps d’exécution. L’analyse statistique est faite par les méthodes print et summary. Pour choisir les colonnes à afficher, utiliser la syntaxe suivante: summary(mb)[, c("expr", "median")] ## expr median ## 1 f1(X) 41.3755 ## 2 f2(X) 48.7135 ## 3 f3(X) 283.8920 ## 4 f4(X) 417.5475 Pour faire des calculs sur ces résultats, il faut les stocker dans une variable. Pour empêcher l’affichage dans la console, la solution la plus simple est d’utiliser la fonction capture.output en affectant son résultat à une variable. dummy <- capture.output(mbs <- summary(mb)) Le test précédent est affiché à nouveau. summary(mb)[, c("expr", "median")] ## expr median ## 1 f1(X) 41.3755 ## 2 f2(X) 48.7135 ## 3 f3(X) 283.8920 ## 4 f4(X) 417.5475 Le temps de calcul est à peu près identique entre \\(x \\times x\\) et \\(x^2\\). Le calcul de puissance est nettement plus long, surtout si la puissance n’est pas entière, parce qu’il nécessite un calcul de logarithme. Le calcul de la puissance 2 est donc optimisé par R pour éviter l’usage du log. Deux représentations graphiques sont disponibles: les violons représentent la densité de probabilité du temps d’exécution; les boîtes à moustache sont classiques. library("ggplot2") autoplot(mb) boxplot(mb) 2.3.3 Profilage profvis est l’outil de profilage de RStudio. Il permet de suivre le temps d’exécution de chaque ligne de code et la mémoire utilisée. L’objectif est de détecter les portions de code lentes, à améliorer. library(profvis) p <- profvis({ # Calculs de cosinus cos(runif(10^7)) # 1/2 seconde de pause pause(1/2) }) htmlwidgets::saveWidget(p, "docs/profile.html") Le résultat est un fichier HTML contenant le rapport de profilage23. On peut observer que le temps de tirage des nombres aléatoires est similaire à celui du calcul des cosinus. Lire la documentation complète24 sur le site de RStudio. 2.4 Boucles Le cas le plus fréquent de code long à exécuter est celui des boucles: le même code est répété un grand nombre de fois. 2.4.1 Fonctions vectorielles La plupart des fonctions de R sont vectorielles: les boucles sont traitées de façon interne, extrêmement rapide. Il faut donc raisonner en termes de vecteurs plutôt que de scalaires. # Tirage de deux vecteurs de trois nombres aléatoires entre # 0 et 1 x1 <- runif(3) x2 <- runif(3) # Racine carrée des trois nombres de x1 sqrt(x1) ## [1] 0.9427738 0.8665204 0.4586981 # Sommes respective des trois nombres de x1 et x2 x1 + x2 ## [1] 1.6262539 1.6881583 0.9063973 Il faut aussi écrire des fonctions vectorielles sur leur premier argument. La fonction lnq du package entropart retourne le logarithme déformé d’ordre \\(q\\) d’un nombre \\(x\\). # Code de la fonction entropart::lnq ## function (x, q) ## { ## if (q == 1) { ## return(log(x)) ## } ## else { ## Log <- (x^(1 - q) - 1)/(1 - q) ## Log[x < 0] <- NA ## return(Log) ## } ## } ## <bytecode: 0x7ffd6fb09748> ## <environment: namespace:entropart> Pour qu’une fonction soit vectorielle, chaque ligne de son code doit permettre que le premier argument soit traité comme un vecteur. Ici: log(x) et x^ sont une fonction et un opérateur vectoriels et la condition [x < 0] retourne aussi un vecteur. 2.4.2 lapply Les codes qui ne peuvent pas être écrits comme une fonction vectorielle nécessitent des boucles. lapply() applique une fonction à chaque élément d’une liste. Elle est déclinée sous plusieurs versions: lapply() renvoie une liste (économise le temps de leur réorganisation dans un tableau); sapply() renvoie un dataframe en rassemblant les listes par simplify2array(); vapply() est presque identique mais demande que le type de données du résultat soit fourni. # Tirage de 1000 valeurs dans une loi uniforme x1 <- runif(1000) # La racine carrée peut être calculée pour le vecteur ou # chaque valeur identical(sqrt(x1), sapply(x1, FUN = sqrt)) ## [1] TRUE mb <- microbenchmark(sqrt(x1), lapply(x1, FUN = sqrt), sapply(x1, FUN = sqrt), vapply(x1, FUN = sqrt, FUN.VALUE = 0)) summary(mb)[, c("expr", "median")] ## expr median ## 1 sqrt(x1) 4.6360 ## 2 lapply(x1, FUN = sqrt) 307.8200 ## 3 sapply(x1, FUN = sqrt) 363.1610 ## 4 vapply(x1, FUN = sqrt, FUN.VALUE = 0) 313.9765 lapply() est beaucoup plus lent qu’une fonction vectorielle. sapply() nécessite plus de temps pour simplify2array(), qui doit détecter comment rassembler les résultats. Enfin, vapply() économise le temps de détermination du type de données du résultat et permet d’accélérer le calcul avec peu d’efforts. 2.4.3 Boucles for Les boucles sont gérées par la fonction for. Elles ont la réputation d’être lentes dans R parce que le code à l’intérieur de la boucle doit être interprété à chaque exécution. Ce n’est plus le cas depuis la version 3.5 de R: les boucles sont compilées systématiquement avant leur exécution. Le comportement du compilateur “juste à temps” est défini par la fonction enableJIT. Le niveau par défaut est 3: les fonctions sont toutes compilées, et les boucles dans le code aussi. Pour évaluer le gain de performance, le code suivant supprime toute compilation automatique, et compare la même boucle compilée ou non. library("compiler") # Pas de compilation automatique enableJIT(level = 0) ## [1] 3 # Boucle pour calculer la racine carrée d'un vecteur Boucle <- function(x) { # Initialisation du vecteur de résultat, indispensable Racine <- vector("numeric", length = length(x)) # Boucle for (i in 1:length(x)) Racine[i] <- sqrt(x[i]) return(Racine) } # Version compilée Boucle2 <- cmpfun(Boucle) # Comparaison mb <- microbenchmark(Boucle(x1), Boucle2(x1)) (mbs <- summary(mb)[, c("expr", "median")]) ## expr median ## 1 Boucle(x1) 786.2435 ## 2 Boucle2(x1) 77.9030 # Compilation automatique par défaut depuis la version 3.5 enableJIT(level = 3) ## [1] 0 Le gain est considérable: de 1 à 10. Les boucles for sont maintenant nettement plus rapides que vapply. # Test mb <- microbenchmark(vapply(x1, FUN = sqrt, 0), Boucle(x1)) summary(mb)[, c("expr", "median")] ## expr median ## 1 vapply(x1, FUN = sqrt, 0) 308.0335 ## 2 Boucle(x1) 76.7870 Attention, le test de performance peut être trompeur: # Préparation du vecteur de résultat Racine <- vector("numeric", length = length(x1)) # Test mb <- microbenchmark(vapply(x1, FUN = sqrt, 0), for(i in 1:length(x1)) Racine[i] <- sqrt(x1[i])) summary(mb)[, c("expr", "median")] ## expr ## 1 vapply(x1, FUN = sqrt, 0) ## 2 for (i in 1:length(x1)) Racine[i] <- sqrt(x1[i]) ## median ## 1 321.7275 ## 2 3364.9430 Dans ce code, la boucle for n’est pas compilée donc elle est beaucoup plus lente que dans le cadre normal de son utilisation (dans une fonction ou au niveau supérieur du code). Les boucles longues permettent un suivi de leur progression par une barre de texte, ce qui est un autre avantage. La fonction suivante exécute des pauses d’un dixième de seconde pendant le temps passé en paramètre (en secondes). BoucleSuivie <- function(duree = 1) { # Barre de progression pgb <- txtProgressBar(min = 0, max = duree * 10) # Boucle for (i in 1:(duree * 10)) { # Pause d'un dixième de seconde Sys.sleep(1/10) # Suivi de la progression setTxtProgressBar(pgb, i) } } BoucleSuivie() ## ============================================================ 2.4.4 replicate replicate() répète une instruction. replicate(3, runif(1)) ## [1] 0.9453453 0.5262818 0.7233425 Ce code est équivalent à runif(3), avec des performances similaires à celles de vapply: de 50 à 100 fois plus lent qu’une fonction vectorielle. mb <- microbenchmark(replicate(1000, runif(1)), runif(1000)) summary(mb)[, c("expr", "median")] ## expr median ## 1 replicate(1000, runif(1)) 3208.786 ## 2 runif(1000) 32.285 2.4.5 Vectorize Vectorize() rend vectorielle une fonction qui ne l’est pas, par des boucles. Ecrire plutôt les boucles. 2.4.6 Statistiques marginales apply applique une fonction aux lignes ou colonnes d’un objet en deux dimensions. colSums et ses semblables (rowSums, colMeans, rowMeans) sont optimisées. # Somme des colonnes numériques du jeu de données diamonds de ggplot() # Boucle identique à l'action de apply(, 2, ) BoucleSomme <- function(Table) { Somme <- vector("numeric", length = ncol(Table)) for (i in 1:ncol(Table)) Somme[i] <- sum(Table[, i]) return(Somme) } mb <- microbenchmark(BoucleSomme(diamonds[-(2:4)]), apply(diamonds[-(2:4)], 2, sum), colSums(diamonds[-(2:4)])) summary(mb)[, c("expr", "median")] ## expr median ## 1 BoucleSomme(diamonds[-(2:4)]) 4.216700 ## 2 apply(diamonds[-(2:4)], 2, sum) 10.272286 ## 3 colSums(diamonds[-(2:4)]) 2.683418 apply clarifie le code mais est plus lent que la boucle, qui est à peine plus lente que colSums. 2.5 Code C++ L’intégration de code C++ dans R est largement simplifiée par le package Rcpp mais reste difficile à déboguer et donc à réserver à du code très simple (pour éviter toute erreur) et répété un grand nombre de fois (pour mériter l’effort). La préparation des données et leur vérification doivent être exécutées sous R, de même que le traitement et la présentation des résultats. L’utilisation habituelle est l’inclusion de code C++ dans un package, mais l’utilisation hors package est possible: Le code C++ peut être inclus dans un document C++ (fichier avec l’extension .cpp): il est compilé par la commande sourceCpp() qui crée les fonctions R permettant d’appeler le code C++. Dans un document RMarkdown, des bouts de code Rcpp peuvent être créés pour y insérer le code C++: ils sont compilés et interfacés pour R au moment du tricotage. L’exemple suivant montre comment créer une fonction C++ pour calculer le double d’un vecteur numérique. #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] NumericVector timesTwo(NumericVector x) { return x * 2; } Une fonction R du même nom que la fonction C++ est maintenant disponible. timesTwo(1:5) ## [1] 2 4 6 8 10 Les performances sont deux ordres de grandeur plus rapides que le code R (voir l’étude de cas, section 2.7). 2.6 Paralléliser R Lorsque des calculs longs peuvent être découpés en tâches indépendantes, l’exécution simultanée (parallèle) de ces tâches permet de réduire le temps de calcul total à celui de la tâche la plus longue, auquel s’ajoute le coût de la mise en place de la parallélisation (création des tâches, récupération des résultats…). Lire l’excellente introduction de Josh Errickson25 qui détaille les enjeux et les contraintes de la parallélisation. Deux mécanismes sont disponibles pour l’exécution de code en parallèle: fork: le processus en cours d’exécution est dupliqué sur plusieurs cœurs du processeur de l’ordinateur de calcul. C’est la méthode la plus simple mais elle ne fonctionne pas sous Windows (limite du système d’exploitation). socket: un cluster est constitué, soit physiquement (un ensemble d’ordinateurs exécutant R est nécessaire) soit logiquement (une instance de R sur chaque cœur de l’ordinateur utilisé). Les membres du cluster communiquent par le réseau (le réseau interne de l’ordinateur utilisé pour un cluster logique). Différents packages de R permettent de mettre en œuvre ces mécanismes. 2.6.1 mclapply (fork) La fonction mclapply du package parallel a la même syntaxe que lapply mais parallélise l’exécution des boucles. Sous Windows, elle n’a aucun effet puisque le système ne permet pas les fork: elle appelle simplement lapply. Cependant, un contournement existe pour émuler mclapply sous Windows en appelant parLapply, qui utilise un cluster. ## ## mclapply.hack.R ## ## Nathan VanHoudnos ## nathanvan AT northwestern FULL STOP edu ## July 14, 2014 ## ## A script to implement a hackish version of ## parallel:mclapply() on Windows machines. ## On Linux or Mac, the script has no effect ## beyond loading the parallel library. require(parallel) ## Loading required package: parallel ## Define the hack # mc.cores argument added: Eric Marcon mclapply.hack <- function(..., mc.cores=detectCores()) { ## Create a cluster size.of.list <- length(list(...)[[1]]) cl <- makeCluster( min(size.of.list, mc.cores) ) ## Find out the names of the loaded packages loaded.package.names <- c( ## Base packages sessionInfo()$basePkgs, ## Additional packages names( sessionInfo()$otherPkgs )) tryCatch( { ## Copy over all of the objects within scope to ## all clusters. this.env <- environment() while( identical( this.env, globalenv() ) == FALSE ) { clusterExport(cl, ls(all.names=TRUE, env=this.env), envir=this.env) this.env <- parent.env(environment()) } clusterExport(cl, ls(all.names=TRUE, env=globalenv()), envir=globalenv()) ## Load the libraries on all the clusters ## N.B. length(cl) returns the number of clusters parLapply( cl, 1:length(cl), function(xx){ lapply(loaded.package.names, function(yy) { require(yy , character.only=TRUE)}) }) ## Run the lapply in parallel return( parLapply( cl, ...) ) }, finally = { ## Stop the cluster stopCluster(cl) }) } ## Warn the user if they are using Windows if( Sys.info()[['sysname']] == 'Windows' ){ message(paste( "\\n", " *** Microsoft Windows detected ***\\n", " \\n", " For technical reasons, the MS Windows version of mclapply()\\n", " is implemented as a serial function instead of a parallel\\n", " function.", " \\n\\n", " As a quick hack, we replace this serial version of mclapply()\\n", " with a wrapper to parLapply() for this R session. Please see\\n\\n", " http://www.stat.cmu.edu/~nmv/2014/07/14/ implementing-mclapply-on-windows \\n\\n", " for details.\\n\\n")) } ## If the OS is Windows, set mclapply to the ## the hackish version. Otherwise, leave the ## definition alone. mclapply <- switch( Sys.info()[['sysname']], Windows = {mclapply.hack}, Linux = {mclapply}, Darwin = {mclapply}) ## end mclapply.hack.R Le code suivant teste la parallélisation d’une fonction qui renvoie son argument inchangé après une pause d’un quart de seconde. Ce document est tricoté avec 3 cœurs, qui sont tous utilisés sauf un pour ne pas saturer le système. f <- function(x, time = 0.25) { Sys.sleep(time) return(x) } # Laisser un coeur libre pour le système nbCoeurs <- detectCores() - 1 # Série : temps théorique = nbCoeurs/4 secondes (tserie <- system.time(lapply(1:nbCoeurs, f))) ## user system elapsed ## 0.002 0.000 0.537 # Parallèle : temps théorique = 1/4 seconde (tparallele <- system.time(mclapply(1:nbCoeurs, f, mc.cores = nbCoeurs))) ## user system elapsed ## 0.006 0.009 0.403 La mise en place de la parallélisation a un coût d’environ 0.15 secondes ici. Le temps d’exécution est bien plus long en parallèle sous Windows parce que la mise en place du cluster prend bien plus de temps que la parallélisation n’en fait gagner. La parallélisation est intéressante pour des tâches plus longues, comme une pause d’un seconde. # Série system.time(lapply(1:nbCoeurs, f, time = 1)) ## user system elapsed ## 0.000 0.000 2.073 # Parallèle system.time(mclapply(1:nbCoeurs, f, time = 1, mc.cores = nbCoeurs)) ## user system elapsed ## 0.001 0.003 1.128 Le temps additionnel nécessaire pour l’exécution parallèle du nouveau code est relativement plus faible: les coûts deviennent inférieurs à l’économie quand le temps de chaque tâche s’allonge. Si le nombre de tâches parallèles dépasse le nombre de cœurs utilisés, les performances s’effondrent parce que la tâche supplémentaire doit être exécutée après les premières. system.time(mclapply(1:nbCoeurs, f, time = 1, mc.cores = nbCoeurs)) ## user system elapsed ## 0.003 0.006 1.155 system.time(mclapply(1:(nbCoeurs + 1), f, time = 1, mc.cores = nbCoeurs)) ## user system elapsed ## 0.003 0.005 2.019 Le temps reste ensuite stable jusqu’au double du nombre de cœurs. La figure 2.2 montre l’évolution du temps de calcul en fonction du nombre de tâches. Taches <- 1:(2 * nbCoeurs+1) Temps <- sapply(Taches, function(nbTaches) { system.time(mclapply(1:nbTaches, f, time=1, mc.cores=nbCoeurs)) }) library("tidyverse") tibble(Taches, Temps=Temps["elapsed", ]) %>% ggplot + geom_line(aes(x = Taches, y = Temps)) + geom_vline(xintercept = nbCoeurs, col = "red", lty = 2) + geom_vline(xintercept = 2 * nbCoeurs, col = "red", lty = 2) Figure 2.2: Temps d’exécution en parallèle de tâches nécessitant une seconde (chaque tâche est une pause d’une seconde). Le nombre de tâches varie de 1 à deux fois le nombre de cœurs utilisés (égal à 2) plus une. La forme théorique de cette courbe est la suivante: pour une tâche, le temps est égal à une seconde plus le temps de mise en place de la parallélisation; le temps devrait rester stable jusqu’au nombre de cœurs utilisés; quand les cœurs sont tous utilisés (pointillés rouges), le temps devrait augmenter d’une seconde puis rester stable jusqu’à la limite suivante. En pratique, le temps de calcul est déterminé par d’autres facteurs difficilement prévisibles. La bonne pratique est d’adapter le nombre de tâches au nombre de cœurs sous peine de perte de performance. 2.6.2 parLapply (socket) parLapply nécessite de créer un cluster, exporter les variables utiles sur chaque noeud, charger les packages nécessaires sur chaque noeud, exécuter le code et enfin arrêter le cluster. Le code de chaque étape se trouve dans la fonction mclapply.hack ci-dessus. Pour un usage courant, mclapply est plus rapide, sauf sous Windows, et plus simple (y compris sous Windows grâce au contournement ci-dessus.) 2.6.3 foreach 2.6.3.1 Fonctionnement Le package foreach permet un usage avancé de la parallélisation. Lire ses vignettes. # Manuel vignette("foreach", "foreach") # Boucles imbriquées vignette("nested", "foreach") Indépendamment de la parallélisation, foreach redéfinit les boucles for. for (i in 1:3) { f(i) } # devient library("foreach") ## ## Attaching package: 'foreach' ## The following objects are masked from 'package:purrr': ## ## accumulate, when foreach(i = 1:3) %do% { f(i) } ## [[1]] ## [1] 1 ## ## [[2]] ## [1] 2 ## ## [[3]] ## [1] 3 La fonction foreach retourne une liste contenant les résultats de chaque boucle. Les éléments de la liste peuvent être combinés par une fonction quelconque, comme c. foreach(i = 1:3, .combine = "c") %do% { f(i) } ## [1] 1 2 3 La fonction foreach est capable d’utiliser des itérateurs, c’est-à-dire des fonctions qui ne passent à la boucle que les données dont elle a besoin sans charger les autres en mémoire. Ici, l’itérateur icount passe les valeurs 1, 2 et 3 individuellement, sans charger le vecteur 1:3 en mémoire. library("iterators") foreach(i = icount(3), .combine = "c") %do% { f(i) } ## [1] 1 2 3 Elle est donc très utile quand chaque objet de la boucle utilise une grande quantité de mémoire. 2.6.3.2 Parallélisation Remplacer l’opérateur %do% par %dopar% parallélise les boucles, à condition qu’un adaptateur, c’est-à-dire un package intermédiaire entre foreach et un package chargé de l’implémentation de la parallélisation, soit chargé. doParallel est un adaptateur pour utiliser le package parallel livré avec R. library(doParallel) registerDoParallel(cores = nbCoeurs) # Série system.time(foreach(i = icount(nbCoeurs), .combine = "c") %do% { f(i) }) ## user system elapsed ## 0.003 0.000 0.577 # Parallèle system.time(foreach(i = icount(nbCoeurs), .combine = "c") %dopar% { f(i) }) ## user system elapsed ## 0.008 0.013 0.271 Le coût fixe de la parallélisation est faible. 2.7 Etude de cas Cette étude de cas permet de tester les différentes techniques vues plus haut pour résoudre un problème concret. L’objectif est de calculer la distance moyenne entre deux points d’un semis aléatoire de 1000 points dans une fenêtre carrée de côté 1. Son espérance est calculable26. Elle est égale à \\(\\frac{2+\\sqrt{2}+5\\ln{(1+\\sqrt{2})}}{15} \\approx 0,5214\\). 2.7.1 Création des données Le semis de points est créé avec le package spatstat. NbPoints <- 1000 library("spatstat") X <- runifpoint(NbPoints) 2.7.2 Spatstat La fonction pairdist() de spatstat retourne la matrice des distances entre les points. La distance moyenne est calculée en divisant la somme par le nombre de paires de points distincts. mb <- microbenchmark(d <- sum(pairdist(X))/NbPoints/(NbPoints - 1)) # suppressmessages pour éliminer les messages superflus suppressMessages(autoplot(mb)) d ## [1] 0.5154062 La fonction est rapide parce qu’elle est codée en langage C dans le package spatstat pour le cœur de ses calculs. 2.7.3 apply La distance peut être calculée par deux sapply() imbriqués. fsapply1 <- function() { distances <- sapply(1:NbPoints, function(i) sapply(1:NbPoints, function(j) sqrt((X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2))) return(sum(distances)/NbPoints/(NbPoints - 1)) } system.time(d <- fsapply1()) ## user system elapsed ## 5.785 0.040 6.177 d ## [1] 0.5154062 Un peu de temps peut être gagnée en remplaçant sapply par vapply: le format des résultats n’a pas à être déterminé par la fonction. Le gain est négligeable sur un long calcul comme celui-ci mais important pour des calculs courts. fsapply2 <- function() { distances <- vapply(1:NbPoints, function(i) vapply(1:NbPoints, function(j) sqrt((X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2), 0), 1:1000 + 0) return(sum(distances)/NbPoints/(NbPoints - 1)) } system.time(d <- fsapply2()) ## user system elapsed ## 5.955 0.055 6.541 d ## [1] 0.5154062 Le format de sortie n’est pas toujours évident à écrire: il doit respecter la taille des données: un vecteur de taille 1000 pour la boucle externe, un scalaire pour la boucle interne. il doit respecter leur type: 0 pour un entier, 0.0 pour un réel. Dans la boucle externe, l’ajout de 0.0 au vecteur d’entiers le transforme en vecteur de réels. Une amélioration plus significative consiste à ne calculer les racines carrées qu’à la fin de la boucle, pour profiter de la vectorisation de la fonction. fsapply3 <- function() { distances <- vapply(1:NbPoints, function(i) vapply(1:NbPoints, function(j) (X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2, 0), 1:1000 + 0) return(sum(sqrt(distances))/NbPoints/(NbPoints - 1)) } system.time(d <- fsapply3()) ## user system elapsed ## 5.576 0.030 5.954 d ## [1] 0.5154062 Les calculs sont effectués deux fois (distance entre les points \\(i\\) et \\(j\\), mais aussi entre les points \\(j\\) et \\(i\\)): un test sur les indices permet de diviser presque le temps par 2 (pas tout à fait parce que les boucles sans calcul, qui retournent \\(0\\), prennent du temps). fsapply4 <- function() { distances <- vapply(1:NbPoints, function(i) { vapply(1:NbPoints, function(j) { if (j > i) { (X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2 } else { 0 } }, 0) }, 1:1000 + 0) return(sum(sqrt(distances))/NbPoints/(NbPoints - 1) * 2) } system.time(d <- fsapply4()) ## user system elapsed ## 3.217 0.030 3.504 d ## [1] 0.5154062 En parallèle, le temps de calcul n’est pas amélioré sous Windows parce que les tâches individuelles sont trop courtes. Sous MacOS ou Linux, le calcul est accéléré. fsapply5 <- function() { distances <- mclapply(1:NbPoints, function(i) { vapply(1:NbPoints, function(j) { if (j > i) { (X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2 } else { 0 } }, 0) }) return(sum(sqrt(simplify2array(distances)))/NbPoints/(NbPoints - 1) * 2) } system.time(d <- fsapply5()) ## user system elapsed ## 3.525 0.334 2.106 d ## [1] 0.5154062 2.7.4 boucle for Une boucle for est plus rapide et consomme moins de mémoire parce qu’elle ne stocke pas la matrice de distances. distance <- 0 ffor <- function() { for (i in 1:(NbPoints - 1)) { for (j in (i + 1):NbPoints) { distance <- distance + sqrt((X$x[i] - X$x[j])^2 + (X$y[i] - X$y[j])^2) } } return(distance/NbPoints/(NbPoints - 1) * 2) } # Temps de calcul, mémorisé (for_time <- system.time(d <- ffor())) ## user system elapsed ## 1.946 0.010 2.100 d ## [1] 0.5154062 C’est la façon la plus simple et efficace d’écrire ce code sans parallélisation et en se limitant au langage de R. 2.7.5 boucle foreach Deux boucles foreach imbriquées sont nécessaires ici: elles sont extrêmement lentes en comparaison d’une boucle simple. Le test est lancé ici avec 10 fois moins de points, donc 100 fois moins de distances à calculer. NbPointsReduit <- 100 Y <- runifpoint(NbPointsReduit) fforeach1 <- function(Y) { distances <- foreach(i = 1:NbPointsReduit, .combine = "cbind") %:% foreach(j = 1:NbPointsReduit, .combine = "c") %do% { if (j > i) { (Y$x[i] - Y$x[j])^2 + (Y$y[i] - Y$y[j])^2 } else { 0 } } return(sum(sqrt(distances))/NbPointsReduit/(NbPointsReduit - 1) * 2) } system.time(d <- fforeach1(Y)) ## user system elapsed ## 2.715 0.034 2.967 d ## [1] 0.5181951 Les boucles foreach imbriquées sont à réserver à des tâches très longues (plusieurs secondes au moins) pour amortir les coûts fixes de leur mise en place. La parallélisation est efficace dans le code ci-dessous, notamment parce qu’elle permet d’éviter les boucles foreach imbriquées. En revanche, les distances sont calculées deux fois. La performance reste très inférieure à celle d’une simple boucle for (rappel: 100 fois moins de distances sont calculées). registerDoParallel(cores = detectCores()) fforeach3 <- function(Y) { distances <- foreach(i=icount(NbPointsReduit), .combine='+') %dopar% { distance <- 0 for (j in 1:Y$n) { distance <- distance + sqrt((Y$x[i]-Y$x[j])^2 + (Y$y[i]-Y$y[j])^2) } distance } return(distances/NbPointsReduit/(NbPointsReduit-1)) } system.time(d <- fforeach3(Y)) ## user system elapsed ## 0.124 0.046 0.142 d ## [1] 0.5181951 foreach dispose d’adaptateurs optimisés permettant d’utiliser des clusters physiques par exemple. Son intérêt est limité avec le package parallel. 2.7.6 RCpp La fonction C++ permettant de calculer les distances est la suivante. #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] double MeanDistance(NumericVector x, NumericVector y) { double distance=0; double dx, dy; for (int i=0; i < (x.length()-1); i++) { for (int j=i+1; j < x.length(); j++) { // Calculate distance dx = x[i]-x[j]; dy = y[i]-y[j]; distance += sqrt(dx*dx + dy*dy); } } return distance/(double)(x.length()/2*(x.length()-1)); } Elle est appelée dans R très simplement. Le temps d’exécution est très court. mb <- microbenchmark(d <- MeanDistance(X$x, X$y)) # suppressmessages pour éliminer les messages superflus suppressMessages(autoplot(mb)) d ## [1] 0.5154062 2.7.7 RcppParallel RcppParallel permet d’interfacer du code C++ parallélisé, au prix d’une syntaxe plus complexe qu’avec RCpp. Une documentation est disponible27. La fonction C++ exportée dans R ne réalise pas les calculs mais organise seulement l’exécution en parallèle d’une autre fonction, non exportée, de type Worker. Deux fonctions (C++) de parallélisation sont disponibles pour deux types de tâches: parallelReduce pour l’accumulation d’une valeur, utilisée ici pour additionner les distances. parallelFor pour remplir une matrice de résultats. La syntaxe du Worker est un peu laborieuse mais assez simple à adapter: les constructeurs initialisent les variables C à partir des valeurs transmises par R et déclarent la parallélisation. // [[Rcpp::depends(RcppParallel)]] #include <Rcpp.h> #include <RcppParallel.h> using namespace Rcpp; using namespace RcppParallel; // Fonction de travail, non exportée struct TotalDistanceWrkr : public Worker { // source vectors const RVector<double> Rx; const RVector<double> Ry; // accumulated value double distance; // constructors TotalDistanceWrkr(const NumericVector x, const NumericVector y) : Rx(x), Ry(y), distance(0) {} TotalDistanceWrkr(const TotalDistanceWrkr& totalDistanceWrkr, Split) : Rx(totalDistanceWrkr.Rx), Ry(totalDistanceWrkr.Ry), distance(0) {} // count neighbors void operator()(std::size_t begin, std::size_t end) { double dx, dy; unsigned int Npoints = Rx.length(); for (unsigned int i = begin; i < end; i++) { for (unsigned int j=i+1; j < Npoints; j++) { // Calculate squared distance dx = Rx[i]-Rx[j]; dy = Ry[i]-Ry[j]; distance += sqrt(dx*dx + dy*dy); } } } // join my value with that of another Sum void join(const TotalDistanceWrkr& rhs) { distance += rhs.distance; } }; // Fonction exportée // [[Rcpp::export]] double TotalDistance(NumericVector x, NumericVector y) { // Declare TotalDistanceWrkr instance TotalDistanceWrkr totalDistanceWrkr(x, y); // call parallel_reduce to start the work parallelReduce(0, x.length(), totalDistanceWrkr); // return the result return totalDistanceWrkr.distance; } L’usage dans R est identique à celui des fonctions C++ interfacées par RCpp. (mb <- microbenchmark(d <- TotalDistance(X$x, X$y)/NbPoints/(NbPoints - 1) * 2)) ## Unit: microseconds ## expr ## d <- TotalDistance(X$x, X$y)/NbPoints/(NbPoints - 1) * 2 ## min lq mean median uq max neval ## 785.688 958.0145 1086.119 1048.265 1142.736 2574.21 100 # suppressmessages pour éliminer les messages superflus suppressMessages(autoplot(mb)) d ## [1] 0.5154062 Le temps de mise en place des tâches parallèles est bien plus long que le temps de calcul en série. En multipliant le nombre de points par 50, le temps de calcul en série doit être multiplié par 2500 environ. NbPoints <- 50000 X <- runifpoint(NbPoints) system.time(d <- MeanDistance(X$x, X$y)) ## user system elapsed ## 7.331 0.046 7.865 En parallèle, le temps augmente peu: la parallélisation devient réellement efficace. Ce temps est à comparer à celui de la boucle for de référence, multiplié par 2500, soit 5250 secondes. system.time(d <- TotalDistance(X$x, X$y)/NbPoints/(NbPoints - 1) * 2) ## user system elapsed ## 4.978 0.034 2.361 2.7.8 Conclusions sur l’optimisation de la vitesse du code De cette étude de cas, plusieurs enseignements peuvent être retirés: une boucle for est une bonne base pour des calculs répétitifs, plus rapide que vapply(), simple à lire et à écrire; des fonctions optimisées peuvent exister dans les packages de R pour des tâches courantes (ici, la fonction pairdist() de spatstat est deux ordres de grandeur plus rapide que la boucle for); le recours au code C++ permet d’accélérer significativement les calculs, de trois ordres de grandeur ici; la parallélisation du code C++ divise encore le temps de calcul par environ la moitié du nombre de cœurs pour de longs calculs. Au-delà de cet exemple, l’optimisation du temps de calcul sous R peut être compliquée si elle passe par la parallélisation et l’écriture de code C++. L’effort doit donc être concentré sur les calculs réellement long alors que la lisibilité du code doit rester la priorité pour le code courant. Le code C est assez facile à intégrer grâce à RCpp et sa parallélisation n’est pas très coûteuse avec RCppParallel. L’utilisation de boucles for n’est plus pénalisante depuis la version 3.5 de R. L’écriture de code vectoriel, utilisant sapply() se justifie toujours pour sa lisibilité. Le choix de paralléliser le code doit être évalué selon le temps d’exécution de chaque tâche parallélisable. S’il dépasse quelques secondes, la parallélisation se justifie. mclapply() remplace lapply() sans aucun effort, mais nécessite un hack (fourni ici) sous Windows. foreach() ne remplace pas for() aussi simplement et ne se justifie que pour des tâches très lourdes en termes de mémoire et de temps de calcul, en particulier sur des clusters de calcul. 2.8 Flux de travail Le package targets permet de gérer un flux de travail (workflow), c’est-à dire de décomposer le code en tâches élémentaires appelées cibles qui s’enchaînent, dont le résultat est stocké dans une variable, elle-même enregistrée sur le disque. En cas de changement dans le code ou les données utilisées, seules les cibles concernées sont réévaluées. Le fonctionnement du flux est proche de celui d’un cache, mais ne dépend pas de l’ordinateur sur lequel il s’exécute. targets permet de visualiser les tâches obsolètes, d’intégrer le flux à un projet de document (voir section 4.9), et même de faire appel à un cluster de calcul pour traiter les tâches en parallèle. 2.8.1 Principe de fonctionnement La documentation28 de targets est détaillée et fournit un exemple travaillé pour apprendre à utiliser le package29. Elle n’est pas reprise ici, mais les principes du fonctionnement du flux sont expliqués. Le flux de travail est unique pour un projet donné. Il est codé dans le fichier _targets.R à la racine du projet. Il contient: des commandes globales, comme le chargement des packages; une liste de cibles, qui décrivent le code à exécuter et la variable qui stocke leur résultat. Le flux est exécuté par la fonction tar_make() qui met à jour les cibles qui le nécessitent. Son contenu est placé dans le dossier _targets. Les variables stockées sont lues par tar_read(). Si le projet nécessite de longs calculs, targets permet de n’exécuter que ceux qui sont nécessaires. Si le projet est partagé ou placé sous contrôle de source (chapitre 3), le résultat des calcul est intégré l’est aussi. Enfin, si le projet est un document (chapitre 4), son formatage est complètement indépendant du calcul de son contenu, pour un gain de temps qui peut être considérable. 2.8.2 Exemple minimal L’exemple suivant est encore plus simple que celui du manuel de targets, qui permettra d’aller plus loin. Il reprend l’étude de cas précédente: un jeu de points est généré puis la distance moyenne entre les points obtenus est calculée. Une carte des points est tracée en plus. Chacune de ces trois opérations est une cible dans le vocabulaire de targets. Le fichier du flux de travail est donc le suivant: # Fichier _targets.R library("targets") tar_option_set(packages = c("spatstat", "dbmss")) list( # Tirage des points tar_target(X, runifpoint(NbPoints) ), # Paramétrage tar_target(NbPoints, 1000 ), # Distance moyenne tar_target(d, sum(pairdist(X)) / NbPoints / (NbPoints - 1) ), # Carte tar_target(map, autoplot(as.wmppp(X)) ) ) Les commandes globales consistent à charger le package targets lui-même puis lister les packages nécessaires au code. L’exécution du flux a lieu dans une nouvelle instance de R. Les cibles sont ensuite listées. Chacune est déclarée par la fonction tar_target() dont le premier argument est le nom de la cible, qui sera celui de la variable qui recevra le résultat. Le deuxième argument est le code qui produit le résultat. Les cibles sont très simples ici et peuvent être écrites en une seule commande. Quand ce n’est pas le cas, chaque cible peut être écrite sous la forme d’une fonction, stockée dans un fichier de code séparé chargé par la fonction source() au début du fichier de flux. La commande tar_visnetwork permet d’afficher l’enchaînement des cibles et leur état éventuellement obsolète. library("targets") tar_visnetwork() L’ordre de déclaration des cibles dans la liste sans importance: elles sont ordonnées automatiquement. Le flux est exécuté par tar_make(). tar_make() ## • start target NbPoints ## • built target NbPoints ## • start target X ## • built target X ## • start target d ## • built target d ## • start target map ## • built target map ## • end pipeline Le flux est maintenant à jour et tar_make() ne refait aucun calcul. tar_visnetwork() tar_make() ## ✔ skip target NbPoints ## ✔ skip target X ## ✔ skip target d ## ✔ skip target map ## ✔ skip pipeline Les résultats sont lus par tar_read(). tar_read(d) ## [1] 0.5189867 tar_read(map) 2.8.3 Intérêt pratique Dans cet exemple, targets complique l’écriture du code et tar_make() est beaucoup plus lent que la simple exécution du code qu’il traite parce qu’il doit vérifier si les cibles sont à jour. Dans un projet réel qui nécessite de longs calculs, le traitement du statut des cibles est négligeable et le gain de temps apporté par la seule évaluation des cibles nécessaires est considérable. La définition des cibles reste une contrainte, mais force à bien structurer son projet. References "],["chap-git.html", "3 Git et GitHub 3.1 Principes 3.2 Créer un nouveau dépôt 3.3 Usage courant 3.4 Branches 3.5 Usage avancé 3.6 Pages GitHub", " 3 Git et GitHub Le contrôle de source consiste à enregistrer l’ensemble des modifications apportées sur les fichiers suivis. Les avantages sont nombreux: traçabilité et sécurité du projet, possibilité de collaborer efficacement, de revenir en arrière, de tenter de nouveaux développements sans mettre en péril la version stable… 3.1 Principes 3.1.1 Contrôle de source L’outil standard est aujourd’hui git. Les commandes de git peuvent être exécutées dans le terminal de RStudio. Figure 3.1: Capture d’écran du terminal de RStudio. La commande git status supposée décrire l’état du dépôt renvoie une erreur si le projet R n’est pas sous contrôle de source. La commande git status (figure 3.1) retourne l’état du dépôt (repository), c’est-à-dire l’ensemble des données gérées par git pour suivre le projet en cours. RStudio intègre une interface graphique pour git suffisante pour se passer de la ligne de commande dans le cadre d’une utilisation standard, présentée ici. 3.1.2 git et GitHub git est le logiciel installé sur le poste de travail. GitHub est une plateforme, accessible par le web30, qui permet de partager le contenu des dépôts git (pour travailler à plusieurs) et de partager de la documentation sous la forme d’un site web (GitHub Pages). Comme GitHub permet au minimum la sauvegarde des dépôts git, les deux sont toujours utilisés ensemble. GitHub n’est pas la seule plateforme utilisable mais la principale. Les alternatives sont Bitbucket31 et GitLab32 par exemple. 3.2 Créer un nouveau dépôt 3.2.1 A partir d’un projet existant Dans un projet R existant, activer le contrôle de source dans les options du projet (figure 3.2). La commande exécutée est git init. Redémarrer RStudio à la demande. Figure 3.2: Activation du contrôle de source dans le menu “Tools > Project Options…”. Une nouvelle fenêtre Git apparaît dans le panneau supérieur droit. Elle contient la liste des fichiers du projet (figure 3.3). Figure 3.3: Fichiers du projet, pas encore pris en compte par git. A ce stade, les fichiers ne sont pas pris en compte par git: leur statut est un double point d’interrogation jaune. Pour git, le répertoire de travail local est un bac à sable où toutes les modifications sont possibles sans conséquences. Le fichier .gitignore contient la liste des fichiers qui n’ont jamais vocation à être pris en compte, qu’il est donc inutile d’afficher dans la liste: les fichiers intermédiaires produits automatiquement par exemple. La syntaxe des fichiers .gitignore est détaillée dans la documentation de git33. En règle générale, utiliser un fichier existant: les modèles de documents notamment incluent leur fichier .gitignore. 3.2.2 Prendre en compte des fichiers Dans la fenêtre git, cocher la case Staged permet de prendre en compte (Stage) chaque fichier. La commande exécutée est git add <NomDeFichier>. Les fichiers pris en compte une première fois ont le statut “A” pour “Added”. Les fichiers pris en compte font partie de l’index de git. 3.2.3 Valider des modifications Figure 3.4: Fenêtre de validation des modifications prises en compte. Les fichiers pris en compte peuvent être validés (Commit) en cliquant sur le bouton “Commit” dans la fenêtre Git. Une nouvelle fenêtre s’ouvre (figure 3.4), qui permet de visualiser toutes les modifications par fichier (ajouts en verts, suppressions en rouge). Le grain de modification traité par git est la ligne de texte, terminée par un retour à la ligne. Les fichiers binaires comme les images sont traités en bloc. Chaque validation (Commit) est accompagnée d’un texte de description. La première ligne est la description courte. Une description détaillée peut être ajoutée après un saut de ligne. Pour la lisibilité de l’historique du projet, chaque commit correspond donc à une action, correspondant à la description courte: tous les fichiers modifiés ne sont pas forcément pris en compte et validés en une fois. La commande exécutée est git commit -m \"Message de validation\". Figure 3.5: Fenêtre de demande d’identification. Les validations sont liées à leur auteur, qui doit être identifié par git. En règle générale, git utilise les informations du système. S’il n’y parvient pas, une fenêtre demande à l’utilisateur de s’identifier avant d’effectuer son premier commit (figure 3.5). Les commandes indiquées sont à exécuter dans le terminal de RStudio. Elles peuvent aussi être utilisées pour vérifier les valeurs connues par git: git config user.name git config user.email Dès la première validation, la branche principale du dépôt, appelée “master”, est créée. Une branche est une version du dépôt, avec son propre historique et donc ses propres fichiers. Les branches permettent: de développer de nouvelles fonctionnalités dans un projet, sans perturber la branche principale qui peut contenir une version stable. Si le développement est retenu, sa branche pourra être fusionnée avec la branche master pour constituer une nouvelle version stable. de contenir des fichiers totalement différents de ceux de la branche principale, pour d’autres objectifs. Sur GitHub, les pages web de présentation du projet peuvent être placés dans une branche appelée “gh-pages” qui ne sera jamais fusionnée. Le dépôt git est complètement constitué. Dans le vocabulaire de git, il comprend trois arbres (figure 3.6): le répertoire de travail, ou bac à sable, qui contient les fichiers non pris en compte: inconnus, modifiés, supprimés ou renommés (case Staged décochée); l’index, qui contient les fichiers pris en compte (case Staged cochée); la tête, qui contient les fichiers validés. Figure 3.6: Les trois arbres de git. Source: https://rogerdudler.github.io/git-guide/index.fr.html Le statut des fichiers est représenté par deux icônes dans la fenêtre Git de RStudio: deux points d’interrogation quand ils n’ont pas été pris en compte par git. Ensuite, l’icône de droite décrit la différence entre le le répertoire de travail et l’index. Celle de gauche décrit la différence entre l’index et la tête. Un fichier modifié aura donc l’icône M affichée à droite avant d’être pris en compte, puis à gauche après prise en compte. Il est possible, même s’il vaut mieux l’éviter, de modifier à nouveau un fichier pris en compte avant qu’il soit validé: alors, les deux icônes seront affichées. 3.2.4 Créer un dépôt vide sur GitHub Figure 3.7: Création d’un dépôt sur GitHub. Un dépôt vide sur GitHub doit être créé (figure 3.7): Sur GitHub, cliquer sur le bouton vert “New repository”. Saisir le nom du dépôt, identique à celui du projet R local. Ajouter une description, qui apparaîtra uniquement sur la page GitHub du dépôt. Choisir le statut du dépôt: Public: visible par tout le monde Privé: visible seulement par les collaborateurs du projet, ce qui exclut de compléter par des pages web de présentation. Ne pas ajouter de README, .gitignore ou licence: le projet doit être vide. Cliquer sur “create Repository”. Copier l’adresse du dépôt (https://github.com/… ou git@github.com:…) Le choix de l’adresse est lié à la méthode d’authentification. L’authentification SSH (voir section 1.4.3) est à privilégier. 3.2.5 Lier git et GitHub Dans RStudio, un premier commit doit au moins avoir eu lieu pour que la branche principale du projet, nommée “master”, existe. En haut à droite de la fenêtre Git (figure 3.3), il est affiché “(no branch)” avant cela. Ensuite, il est affiché “master”, le nom par défaut de la branche principale du projet. Le projet peut alors être lié au dépôt GitHub. 3.2.5.1 Méthode graphique Cliquer sur le bouton violet à côté de “master”: une fenêtre apparaît (habituellement utilisée pour la création d’une nouvelle branche, voir section 3.4). Saisir le nom de la branche “master”, cliquer sur “Add Remotes” et compléter: Remote Name: origin; Remote URL: coller l’adresse du dépôt GitHub; Cliquer sur “Add”. Cocher la case “Sync with Remote”. Au message indiquant qu’une branche master existe déjà, cliquer sur “Overwrite”. 3.2.5.2 En ligne de commande Plutôt que la manipulation précédente, le lien entre Git et GitHub peut être mis en place par quelques commandes de git exécutées dans le terminal de RStudio. Elles sont affichées sur la page d’accueil de tout dépôt vide nouvellement créé sur GitHub et peuvent donc être copiées et collées directement vers le terminal. git remote add origin git@github.com:GitHubID/NomDuDepot.git git branch -M master git push -u origin master La première commande déclare le dépôt GitHub comme dépôt distant. Le nom origin est une convention de git. Il peut être modifié mais l’organisation du projet sera plus lisible en respectant la convention. L’adresse du dépôt est https://github.com/GitHubID/NomDuDepot.git si l’authentification HTTPS est choisie. Les commandes suivantes activent la branche principale du projet et poussent son contenu vers GitHub. Attention au nom de la branche principale (voir section 3.4): par défaut, elle s’appelle “master” dans un projet créé dans RStudio mais “main” sur GitHub. Les lignes de commande ci-dessus fournies par GitHub remplacent donc master par main et doivent être corrigées pour correspondre au nom de la branche créée par RStudio. 3.2.5.3 Authentification Si l’authentification HTTPS est choisie, à la première connexion de RStudio à GitHub, une fenêtre permet de saisir ses identifiants GitHub (figure 3.8). Figure 3.8: Identification HTTPS sur GitHub. Depuis août 2021, GitHub n’accepte plus le mot de passe du compte de l’utilisateur pour cette authentification: le jeton personnel (PAT) créé en section 1.4.4 doit être saisi à sa place. Si l’authentification SSH est choisie et a été configurée à l’installation de git (section 1.4.3), aucune action n’est nécessaire. 3.2.6 Pousser les premières modifications La manipulation précédente a automatiquement poussé (Push) les modifications validées sur GitHub. Par la suite, il faudra cliquer sur le bouton “Push” de la fenêtre Git pour le faire. Sur GitHub, les fichiers résultant des modifications enregistrées par git sont maintenant visibles. Chaque commit réalisé localement est compté par git et un message “Your branch is ahead of ‘origin/master’ by n commits” affiché dans en haut de la fenêtre Git indique qu’il est temps de mettre à jour GitHub en poussant l’ensemble de ces commits. Cliquer sur le bouton “Push” pour le faire. A ce stade, le projet doit disposer d’un fichier README.md qui présente son contenu sur GitHub. Son contenu minimal est un titre et quelques lignes de description: # Nom du Projet Description en quelques lignes. Il est conseillé d’utiliser des badges34, à placer juste après le titre, pour déclarer l’état de maturité du projet, par exemple: ![stability-wip](https://img.shields.io/badge/|> stability-work_in_progress-lightgrey.svg) 3.2.7 Cloner un dépôt de GitHub Figure 3.9: Clonage d’un dépôt à partir de GitHub. Tout dépôt sur GitHub peut être installé (on dit cloné) sur le poste de travail en copiant son adresse qui apparaît en cliquant sur le bouton vert (figure 3.9). Dans RStudio, créer un nouveau projet et, dans l’assistant, choisir “Version Control”, “Git” et coller l’adresse dans le champ “Repository URL”. Le nom répertoire à créer pour le projet est déduit automatiquement de l’adresse. Choisir le répertoire dans lequel celui du projet va être créé et cliquer sur “Create Project”. Le projet créé est lié au dépôt distant sur GitHub. Pour travailler à plusieurs sur le même projet, le propriétaire du projet doit donner l’accès au projet à des collaborateurs (figure 3.10), c’est-à-dire d’autres utilisateurs GitHub dans les réglages du dépôt (Settings). Figure 3.10: Attribution des droits d’accès sur GitHub. Les collaborateurs sont invités par un message envoyé par GitHub. 3.3 Usage courant 3.3.1 Tirer, modifier, valider, pousser Toute séance de travail sur un projet commence en tirant (Bouton “Pull”) de la fenêtre Git pour intégrer au dépôt local les mises à jour effectuées sur GitHub par d’autres collaborateurs. Les modifications apportées aux fichiers du projet sont ensuite prises en compte (cocher les cases Staged) et validées (Commit) avec un message explicatif. Une bonne pratique consiste à valider les modifications à chaque fois qu’une tâche élémentaire, qui peut être décrite dans le message explicatif, est terminée plutôt que d’effectuer des commits regroupant de nombreux changements avec une description vague. Dès que possible, pousser (Push) les mises à jour pour qu’elles soient visibles par les collaborateurs. 3.3.2 Régler les conflits Il n’est pas possible de pousser les modifications validées si un collaborateur a modifié le dépôt distant sur GitHub. Il faut alors les tirer pour les intégrer au dépôt local avant de pousser les modifications fusionnées. Un conflit a lieu si un Pull importe dans le fichier local une modification qui ne peut pas être fusionnée automatiquement parce qu’une modification contradictoire a eu lieu localement. Git considère chaque ligne comme un élément indivisible: la modification de la même ligne sur le dépôt distant et le dépôt local génère donc un conflit. Git insère dans le fichier contenant un conflit les deux versions avec une présentation particulière: <<<<<<<<< HEAD # Version importée du conflit Lignes en conflit, version importée ========= # limite entre les deux versions Lignes en conflit, version locale >>>>>>>>> # Fin du conflit Les lignes de formatage contenant les <<<<, les ==== et les >>>> doivent être supprimés et une seule version des lignes problématiques conservée, qui peut être différente des deux versions originales. La résolution du conflit doit être prise en compte et validée. Pour limiter les conflits dans un document contenant du texte (typiquement, un document R Markdown), une bonne pratique consiste à traiter chaque phrase comme une ligne, terminée par un retour à la ligne qui ne sera pas visible dans le document mis en forme: un saut de ligne est nécessaire pour séparer les paragraphes. 3.3.3 Voir les différences Dans la fenêtre Git de RStudio, le menu contextuel (affiché par un clic droit) “Diff” peut être utilisé pour afficher les modifications apportées à chaque fichier (figure 3.11). Figure 3.11: Différences entre le répertoire de travail et la tête. 3.3.4 Revenir en arrière Le menu contextuel “Revert” permet d’annuler toutes les modifications apportées à un fichier (affichées par Diff) et de rétablir son contenu validé la dernière fois (son état dans la tête). Il n’est pas simple de revenir en arrière au-delà de la dernière validation parce que les modifications ont pu être prises en compte par des collaborateurs: leur suppression rendrait le projet incohérent. 3.3.5 Voir l’historique Le bouton en forme d’horloge de la fenêtre Git de RStudio affiche l’historique du projet (figure 3.12). Figure 3.12: Historique des validations dans le dépôt. En haut se trouve la tête, puis toutes les validations (commits) qui l’ont constituée. Pour chaque validation, les différences de chaque fichier peuvent être affichées en cliquant sur le nom du fichier dans la partie basse de la fenêtre. 3.4 Branches Les branches d’un projet sont des versions différentes mais simultanées. Un usage typique est le développement d’une nouvelle fonctionnalité. Si son écriture prend du temps, le projet est perturbé par le chantier en cours: le code peut ne plus fonctionner. Si le développement s’avère impossible ou inutile, il faut pouvoir l’abandonner sans dommage. Pour l’isoler pendant sa réalisation et se permettre de le valider ou de l’abandonner à la fin, il faut le placer dans une branche. La branche principale du projet s’appelle “master” ou “main” à partir de novembre 202035. Elle doit toujours être dans un état stable: c’est elle qui est clonée à partir de GitHub par d’autres utilisateurs éventuels. Le changement de convention pour le nom de la branche “master” fait qu’à partir de novembre 2020, les projets créés sur GitHub clonés dans RStudio ont pour branche principale “main” alors que les projets créés sur RStudio puis liés à GitHub conservent le nom “master”. 3.4.1 Créer une nouvelle branche Cliquer sur le bouton violet “New Branch” dans la fenêtre git de RStudio. Saisir son nom et cliquer sur “Create”. La nouvelle branche est maintenant active. Les commandes git peuvent aussi être exécutées dans le terminal (pour créer la branche et l’activer): git branch new_branch git checkout new_branch 3.4.2 Changer de branche Sélectionner la branche à activer dans la liste des branches locales de la la fenêtre git. Les commits s’appliquent à la branche active. Chaque branche se comporte comme une version différente du projet. Attention: pour éviter la confusion, sauvegarder les modifications, prendre en compte et valider les changements avant de changer de branche. 3.4.3 Pousser la nouvelle branche Les premières modifications de la nouvelle branche doivent être poussées en ligne de commande parce que les boutons “Push” et “Pull” de la fenêtre Git ne fonctionnent pas tant que la branche n’existe pas sur le dépôt distant. Exécuter, dans le terminal: git push -u origin new_branch 3.4.4 Comportement du système de fichier A chaque changement de branche, git réécrit les fichiers du projet pour qu’ils reflètent l’état de la branche. Les changements peuvent être observés hors de RStudio, dans l’explorateur de fichier par exemple. Les fichiers ignorés par .gitignore ne sont pas modifiés. Il est donc indispensable que les fichiers .gitignore des différentes branches soit identiques, sinon des fichiers ignorés dans une branche apparaîtront comme ajoutés dans la branche affichée après un changement. Les branches de développement ont un contenu proche de celui de la branche principale. Ce n’est pas le cas de branches spécialisées vues plus loin, comme gh-pages (voir section 3.6) qui contient le site web de présentation du dépôt. Il est préférable de ne pas tenter d’afficher ces branches dans RStudio: leur contenu est produit automatiquement et ne doit pas être modifié manuellement. Si c’est indispensable, il faudra y copier le fichier .gitignore de la branche principale et garder à l’esprit que les fichiers ignorés appartiennent en réalité à une autre branche que celle affichée. 3.4.5 Fusionner avec merge La fusion d’une branche de développement avec la branche principale marque l’atteinte de son objectif: son code va être intégré au projet. L’interface graphique de RStudio ne prévoit pas les fusions, il faut donc utiliser le terminal: tout d’abord, se placer dans la branche cible (possible avec l’interface graphique): git checkout master Ensuite, fusionner: git merge new_branch Dans la majorité des situations, la fusion sera automatique (“Fast Forward”). Il est possible que des conflits apparaissent: utiliser la commande git status pour afficher la liste des fichiers concernés, les ouvrir, régler le confit et effectuer un commit. La branche fusionnée n’est pas supprimée: elles peut être utilisée à nouveau pour d’autres développements ou supprimée manuellement avec la commande suivante: git branch -d new_branch 3.4.6 Fusionner avec une requête de tirage L’autre façon de fusionner est plus formelle mais aussi plus générale: elle permet de fusionner une branche dans un dépôt d’un autre utilisateur pour y contribuer, ou de faire valider sa branche par un autre membre de l’équipe dans un projet collaboratif. Pour contribuer au projet d’un autre utilisateur de GitHub36, il faut commencer par en créer un fork, c’est-à-dire une copie sous la forme d’un dépôt lié à l’original. Il sera possible de tirer les modifications de l’original pour rester à jour37 (par opposition à une simple copie instantanée possible en téléchargeant un Zip du projet) et, à la fin du développement, de fusionner le fork au dépôt original (par opposition à un clone qui ne permettrait pas de contribuer par la suite). Ensuite, il faut créer une branche de développement comme précédemment, la modifier et finalement demander au propriétaire du dépôt de la fusionner. Ce processus est décrit en détail dans la documentation de git . Dans le cadre plus simple d’une branche de son propre projet comme dans le cas d’un fork, la branche de développement est prête à être fusionnée. Elle doit avoir être poussée sur GitHub. Sur la page GitHub du projet, un bouton “Create Pull Request” permet de demander la fusion. Un message décrivant les modifications proposées avec leur argumentaire doit être ajouté. Le propriétaire du projet (les membres de l’équipe dans le cadre d’un projet collaboratif, ou soi-même si l’équipe se réduit à une personne) est averti de la requête de tirage. Sur la page du projet original, il est possible de voir le message, la liste des modifications (chronologie des commits ou comparaison des fichiers), d’engager un discussion avec l’auteur de la requête… Si la requête n’est pas retenue, elle peut être fermée. Si elle est validée, le bouton “Merge Pull Request” permet de fusionner la branche de développement avec la branche “master” (ou une autre) du projet source. Les requêtes de tirage sont le seul moyen de contribuer à un dépôt sur lequel on ne dispose pas de droits d’écriture. C’est aussi le moyen de fusionner une branche de développement dans sont propre projet en en gardant une trace explicite (dans la rubrique Pull requests de la page GitHub du projet). Dans le cadre d’un projet collaboratif, les propositions d’un membre (auteur de la requête) peuvent être validées par un autre (qui accepte la fusion). 3.5 Usage avancé 3.5.1 Commandes de git Au-delà de l’usage courant permis par l’interface graphique de RStudio, des manipulations avancées des projets sont permises en utilisant git en ligne de commande. Quelques exemples utiles sont présentés ici. Un petit guide des commandes est proposé par Roger Dudler38. Il résume les commandes essentielles, donc intégrées à l’interface graphique de RStudio. Des liens vers des références plus complètes sont donnés en bas de la page. 3.5.2 Taille d’un dépôt Pour connaître l’espace disque occupé par un dépôt, utiliser la commande git count-objects -vH39. Les données pour ce document au stade de la rédaction sont présentées à titre d’exemple. $ git count-objects -v count: 200 size: 2.66 MiB in-pack: 0 packs: 0 size-pack: 0 prune-packable: 0 garbage: 0 size-garbage: 0 La taille totale est sur la ligne size. Les packs sont une méthode utilisée par git pour réduire la taille du dépôt: des fichiers similaires sont stockés sous la forme d’une partie commune et de différences. La ligne prune-packable donne la taille d’objets stockés à la fois sous forme individuelle et dans des packs. Si leur taille est importante, exécuter git prune-packed pour la ramener à zéro. La ligne size-garbage donne la taille des objets qui peuvent être supprimés. git gc les supprime, mais pas seulement: il optimise le stockage. $ git gc Enumerating objects: 194, done. Counting objects: 100% (194/194), done. Delta compression using up to 8 threads Compressing objects: 100% (188/188), done. Writing objects: 100% (194/194), done. Total 194 (delta 83), reused 0 (delta 0) $ git count-objects -vH count: 1 size: 5.72 KiB in-pack: 194 packs: 1 size-pack: 4.00 MiB prune-packable: 0 garbage: 0 size-garbage: 0 bytes Ici, la majorité des objets du dépôt a été placée dans un pack (mais sa taille est supérieure à celle des objets individuels). Il est généralement inutile d’effectuer la collecte des déchets manuellement: git gère bien l’organisation de ses dépôts. GitHub limite la taille des dépôts. En mai 2020, la limite est de 100 Go. La taille de tous les dépôts d’un utilisateur authentifié peut être affichée dans les réglages de son compte (“Personnal Settings”, “Repositories”)40. 3.5.3 Supprimer un dossier Toutes les modifications apportées à un dépôt sont stockées dans son historique. Il peut être utile d’en supprimer dans quelques cas particuliers: si un fichier contenant des informations confidentielles a été validé par mégarde. La validation de sa suppression ne le retire pas de l’historique, et les informations confidentielles restent visibles en consultant l’historique. si des fichiers volumineux ne sont plus nécessaires, par exemple des fichiers PDF produits par R Markdown (chapitre 4), binaires (donc inadaptés à git) et reproductibles à partir du code. Typiquement, le dossier docs est utilisé pour stocker les documents produits à partir de code R Markdown. Les fichiers HTML et PDF doivent s’y trouver pour constituer les pages GitHub du projet. Chaque modification du dépôt génère une nouvelle version de ces fichiers dont le volume de l’historique devient rapidement considérable. Une solution efficace consiste à déléguer la création de ces fichiers à un système d’intégration continue (chapitre 6) et à retirer le dossier docs de la branche principale (master) du dépôt. Il faut alors supprimer tout son historique pour récupérer la place qu’il occupe, qui peut être l’essentiel de la taille du dépôt. Les commandes de suppression complète d’un dossier d’un dépôt son présentées ici41. Le dépôt doit être propre, c’est-à-dire sans modifications non validées, et les versions distantes et locales synchronisées. Les trois commandes suivantes suppriment complètement le dossier docs de l’historique du dépôt git: git filter-branch --tree-filter "rm -rf docs" |> --prune-empty HEAD git for-each-ref --format="%(refname)" refs/original/ |> | xargs -n 1 git update-ref -d Le dossier n’est pas supprimé du répertoire de travail. Il doit donc être ajouté au fichier .gitignore pour ne plus être suivi. La modification de .gitignore doit être validée. Ces opérations peuvent être réalisées avec l’interface de RStudio ou en ligne de commande: echo docs/ >> .gitignore git add .gitignore git commit -m 'Removing docs folder from git history' Le nettoyage du dépôt est nécessaire pour supprimer physiquement les données retirées: git gc Enfin, le dépôt doit être poussé. L’option --force implique le remplacement du contenu du dépôt distant par celui du dépôt local: toutes les modifications faites par des collaborateurs sont effacées, c’est pourquoi cette opération de nettoyage implique l’arrêt complet du projet pendant qu’elle a lieu. git push origin master --force Ce code peut être utilisé pour supprimer totalement n’importe quel fichier ou dossier d’un dépôt en remplaçant simplement docs dans la commande git filter-branch initiale. La réduction de la taille du dépôt peut être suivie en utilisant git count-objects -vH avant l’opération, avant git gc (la taille du dépôt reste stable mais a été déplacée vers garbage) et à la fin (la taille du dépôt est sensiblement réduite). 3.5.4 Revenir en arrière Il est possible de restaurer un dépôt dans un état précédent en plaçant sa tête (figure 3.6) au niveau d’un ancien commit. Toutes les modifications ultérieures sont alors détruites. Cette opération ne doit pas être réalisée sur un dépôt partagé: les autres utilisateurs ne pourraient plus pousser leurs modifications. Afficher l’historique du dépôt et rechercher l’identifiant (SHA) du dernier commit à conserver. Dans le terminal de RStudio, exécuter: git reset --hard <SHA> git push -f Tout l’historique du dépôt après le point de restauration choisi est perdu. Une méthode moins radicale et utilisable sur un dépôt partagé consiste à exécuter un commit qui annule les modifications d’un autre mais ne détruit aucune donnée de l’historique. Cette opération n’annule qu’un seul commit à la fois et doit donc être répétée pour en annuler plusieurs, en commençant par le plus récent. Dans le terminal de RStudio, exécuter: git revert <SHA> Pour annuler le dernier commit, exécuter: git revert HEAD Utiliser HEAD évite simplement de rechercher l’identifiant correspondant. 3.6 Pages GitHub Tout projet sur GitHub doit avoir contenir un fichier README.md pour le présenter. Ce fichier est écrit au format Markdown. Le fichier peut être placé dans le dossier docs pour fournir à fois la page d’accueil du dépôt et de son site web. Le package memoiR fournit des commandes permettant d’automatiser ces tâches dans les projets de documents. Un dépôt contenant un mémo écrit en R Markdown (voir section 4.3.2) est utilisé comme exemple42. Son fichier README.md existe aux deux emplacements: il est écrit par le développeur à la racine du projet et dupliqué par GitHubPages.R. 3.6.1 Activation Pour activer les pages GitHub, il faut ouvrir les propriétés du dépôt (Settings) et modifier la rubrique “GitHub Pages” (dans “Options”). Sélectionner la branche du projet et le dossier contenant les pages web, ici: master et /docs. En option, le choix d’un thème personnalise l’apparence des pages. Le site web est accessible à une adresse43 du domaine github.io. Le fichier README.md affiché en page d’accueil a un aspect très différent mais le même contenu que celui affiché avec le code sur la page du dépôt dans GitHub. L’intérêt des pages GitHub est de permettre un accès simple aux documents formatés quand le dépôt contient une production écrite et ou à la documentation des packages R. Ces contenus seront présentés dans le chapitre suivant. Un site web principal est proposé avec chaque compte GitHub, à l’adresse https://GitHubID.github.io44. Il sera utilisé pour héberger un site web personnel produit par blogdown. 3.6.2 Badges Les badges sont de petites images, éventuellement mises à jour dynamiquement, qui renseignent rapidement sur le statut d’un projet. Ils doivent être placés immédiatement après le titre du fichier README.md. Une bonne pratique consiste à indiquer l’avancement dans le cycle de vie du projet. Les badges correspondants sont listés sur le site du Tidyverse45. Leur code Markdown est le suivant: ![stability-wip] (https://img.shields.io/badge/lifecycle-maturing-blue.svg) Le package usethis simplifie leur création en plaçant le code nécessaire dans le presse-papier. Il suffit ensuite de le coller dans le fichier. usethis::use_lifecycle_badge("maturing") https://github.com/↩︎ https://bitbucket.org/↩︎ https://about.gitlab.com/↩︎ https://git-scm.com/docs/gitignore↩︎ https://github.com/orangemug/stability-badges↩︎ https://github.com/github/renaming↩︎ https://git-scm.com/book/fr/v2/GitHub-Contribution-%C3%A0-un-projet↩︎ https://ardalis.com/syncing-a-fork-of-a-github-repository-with-upstream/↩︎ https://rogerdudler.github.io/git-guide/index.fr.html↩︎ https://git-scm.com/docs/git-count-objects↩︎ https://github.com/settings/repositories↩︎ https://stackoverflow.com/questions/10067848/remove-folder-and-its-contents-from-git-githubs-history↩︎ https://github.com/EricMarcon/Krigeage↩︎ https://EricMarcon.github.io/Krigeage/↩︎ Exemple: https://EricMarcon.github.io/Krigeage/↩︎ https://www.tidyverse.org/lifecycle/↩︎ "],["chap-rediger.html", "4 Rédiger 4.1 Bloc-note Markdown (R Notebook) 4.2 Modèles R Markdown 4.3 Articles avec bookdown 4.4 Présentation Beamer 4.5 memoir 4.6 Site web R Markdown 4.7 Site web personnel : blogdown 4.8 Exportation de figures 4.9 Flux de travail", " 4 Rédiger R et RStudio permettent de rédiger efficacement des documents de tous formats, du simple bloc-note à la thèse, en passant par des diaporamas. Les outils pour le faire sont l’objet de ce chapitre, complété par la production de sites web (y compris un site personnel). 4.1 Bloc-note Markdown (R Notebook) Dans un fichier .R, le code doit toujours être commenté pour faciliter sa lecture. Quand l’explication du code nécessite plusieurs lignes de commentaire par ligne ou bloc de code, il est temps d’inverser la logique et de placer le code dans un texte. Le concept de programmation lettrée (literate programming) a été développé par Knuth (1984). Il s’agit de décrire les objectifs et les méthodes par du texte, dans lequel le code s’intègre. L’outil le plus simple est le bloc-note Markdown (Menu “File > New File > R Notebook”). Le modèle de document contient son mode d’emploi. Le langage qui permet de formater le texte est Markdown46, un langage de balisage simple à utiliser: Les paragraphes sont séparés par des sauts de ligne; Le document est structuré par des titres: leur ligne commence par un nombre de # correspondant à leur niveau; Les formats de caractères sont limités à l’essentiel: italique ou gras (texte entouré par une ou deux *); D’autres codes simples permettent tous les formatages utiles. Ce langage est le pivot du logiciel pandoc47, dédié à la conversion de documents de formats différents. Le package rmarkdown (Xie 2015) fait le lien entre R et Markdown, en s’appuyant sur l’interface de RStudio qui n’est pas indispensable mais simplifie énormément son utilisation. Le dialecte de Markdown utilisé par le package est appelé R Markdown. Sa syntaxe est résumée dans une antisèche48. Sa documentation complète est en ligne (Xie, Allaire, et Grolemund 2018). Les équations sont écrites au format LaTeX49. L’organisation la plus simple d’un document R Markdown est visible dans le modèle de bloc-note. Il commence par un en-tête au format YAML50: --- title: "R Notebook" output: html_notebook --- La première entrée est le titre, la seconde le format de sortie: plus précisément le nom de la fonction chargée de traiter le document. Le document contient du texte formaté en Markdown et des bouts de code (code chunks) entourés par trois accents graves (la syntaxe markdown d’un bloc de code) et une description du langage, ici r. Ces bouts de code sont traités par knitr qui transforme le résultat de l’exécution du code R en Markdown et l’intègre au texte du document. Traiter un document R Markdown s’appelle le tricoter (knit). La chaîne de production est la suivante : knitr traite les bouts de code: calculs, production de figures; rmarkdown intègre la production des bouts de code et texte pour produire un fichier Markdown standard; pandoc (installé avec RStudio) convertit ce fichier au format HTML, LaTeX ou Word; LaTeX produit un fichier PDF quand ce format est demandé. RStudio permet de lancer le tricot par des boutons plutôt que par des commandes: dans la fenêtre source (celle du haut à gauche), un bouton “Knit” accompagne les documents R Markdown. Pour les bloc-notes R Markdown, il est remplacé par un bouton “Preview” avec les mêmes fonctions. Il peut être déroulé pour choisir le format de sortie: HTML, Word, PDF (en passant par LaTeX) et, pour les bloc-notes, une commande “Preview” qui affiche le document en HTML sans exécuter les bouts de code pour gagner du temps. Dès le premier tricot au format Word ou HTML, on remarquera que le bouton “Preview” disparaît. Au final, l’utilisation de R Markdown combine plusieurs avantages: La simplicité de la rédaction: le texte brut est plus facile à lire et à formater qu’en LaTeX par exemple; L’automatisation de la production: le formatage et la mise en page sont entièrement automatiques; La reproductibilité: chaque document peut être autosuffisant accompagné de ses données. Relancer le tricotage régénère entièrement le document, y compris les calculs nécessaires et la production des figures. Elle a aussi quelques inconvénients: Le formatage dépend de modèles, et developper de nouveaux modèles n’est pas simple; Les erreurs de tricot sont parfois difficiles à corriger, notamment quand elles interviennent à l’étape de la compilation LaTeX; La reproductibilité consomme du temps de calcul. Pour limiter ce problème, un système de cache permet de ne pas réévaluer tous les bouts de code R à chaque modification du texte. La production de gros documents peut aussi être déléguée à un système d’intégration continue (chapitre 6). 4.2 Modèles R Markdown Des modèles de document plus élaborés que le bloc-note sont fournis par des packages, dont rmarkdown. Ils sont accessibles par le menu “File > New File > R Markdown…” (figure 4.1)). Figure 4.1: Nouveau document Markdown à partir d’un modèle. Les modèles les plus simples sont Document et Presentation. Les informations à fournir sont le titre et le nom de l’auteur, et le format du document attendu (qui pourra être modifié plus tard). Ces modèles créent un seul fichier dont l’enregistrement ne sera obligatoire qu’au moment de tricoter. La syntaxe est la même que celle du bloc-note. Dans l’entête, une entrée supplémentaire est utilisée pour la date, qui peut être calculée par R à chaque tricot: date: "|r format(Sys.Date(), '%d/%m/%Y')|" Remplacer les barres verticales | de l’exemple ci-dessus par des guillemets inversés: ce document étant écrit avec R Markdown, la date serait calculée et affichée à la place du code si les guillemets inversés étaient utilisés directement. Le code R en ligne (par opposition aux bouts de code) peut être utilisé partout dans un document R Markdown, y compris dans l’entête pour l’affichage de la date. Il commence par un guillemet inversé suivi de r et se termine par un autre guillemet inversé. Les documents peuvent être tricotés au format HTML, PDF (via LaTeX) ou Word. L’entête du fichier R Markdown est réécrit quand le tricot est lancé par le bouton de RStudio qui place en premier le format de sortie utilisé et l’ajoute si nécessaire. Les présentations peuvent être tricotées dans deux formats HTML, ioslide51 ou Slidy52, au format Beamer (PDF)53 ou en Powerpoint54. Le niveau 2 de plan (##) marque le changement de diapositive. Du code supplémentaire, présenté dans les documentations des formats HTML, permet d’utiliser des fonctionnalités spécifiques. Ces modèles sont simples mais assez peu utiles: le bloc-note R est plus facile à utiliser que le modèle de document pour des documents minimalistes. Des modèles plus élaborés sont disponibles. 4.3 Articles avec bookdown R Markdown ne permet pas de rédiger un article scientifique. La bibliographie ne pose pas de problème parce qu’elle est gérée par pandoc pour les documents HTML ou Word et sous-traitée à LaTeX pour les documents PDF. Les équations, figures et tableaux sont numérotés par LaTeX mais pas en HTML. Les références croisées (les renvois à un numéro de figure par exemple) ne sont pas supportés. Enfin, les légendes de figures ou tableaux ne supportent que du texte brut, sans aucun formatage. bookdown comble ces manques. Le package a été conçu pour la rédaction d’ouvrages comportant plusieurs chapitres mais peut être utilisé pour des articles. Le package ne fournit pas directement de modèles. Le package memoiR fournit les modèles présentés ici. Il doit être installé. 4.3.1 Ecrire Les principales caractéristiques de Markdown sont résumées ici. Une formation rapide et plus complète est proposée par RStudio55. Le texte est écrit sans aucun autre formatage que les les retours à la ligne. Un simple retour à la ligne n’a aucun effet sur le document produit: il permet de séparer les phrases pour simplifier le suivi du code source par git. Un saut de ligne marque un changement de paragraphe. Les différents niveaux de plan sont désignés par le nombre de croisillons correspondant en début de ligne: # pour un titre de niveau 1, ## pour un titre de niveau 2, etc. Un espace sépare les croisillons et le texte du titre. Les liste à puces sont marquées par un tiret (suivi d’un espace) en début de ligne. Un saut de ligne est nécessaire avant le début de la liste mais les éléments de la liste sont séparés par un simple retour à la ligne. Les listes indentées sont créées en insérant 4 espaces avant le tiret de début de ligne. Enfin, les listes numérotées sont créées de la même façon en remplaçant les tirets par des nombres, dont la valeur n’a pas d’importance. Dans le texte, les parties en italique sont entourées par une étoile ou un tiret bas (*italique*), alors que deux étoiles marquent le gras. 4.3.1.1 Code R Le code R est inclus dans des bouts de code (code chunks) créés facilement en cliquant sur le bouton “Insert a new code chunk” au-dessus de la fenêtre du code source dans RStudio. Ils commencent et se terminent par trois guillemets inversés sur une nouvelle ligne. Ces bouts de code peuvent contenir du code R mais aussi Python par exemple: le type de code est indiqué dans l’entête sur la première ligne, avant le nom du bout de code, puis une liste d’options séparées par des virgules, par exemple: ```{r cars, echo=TRUE} ``` Le nom et les options sont facultatifs: l’entête minimal est {r}. Les options les plus utiles sont : echo pour afficher (=TRUE) ou cacher (=FALSE) le code; message=FALSE pour cacher les messages d’ouverture de certains packages; warning=FALSE pour cacher les avertissements. Les options par défaut sont déclarées dans le bout de code nommé “Options” au début du document Markdown, dans la fonction opts_chunk$set(). L’option echo doit être mise à FALSE par défaut pour un article scientifique par exemple. 4.3.1.2 Figures plot(pressure) Figure 4.2: Titre de la figure Les figures peuvent être créées par le code R (figure 4.2). Avec Bookdown, une étiquette est associée à chaque figure: son nom est fig:xxx où xxx est le nom du bout de code R. Les renvois se font avec la commande \\@ref(fig:xxx). L’entête du bout de code de la figure 4.2 est: ```{r pressure, fig.cap="Titre de la figure"} ``` Il contient au minimum le nom de la figure et sa légende. Si la légende est longue, l’entête est peu lisible. De plus, la légende est limitée à du texte simple. Pour des légendes plus élaborées, il est possible de déclarer la légende dans un paragraphe séparé qui commence par le texte (ref:NomFigure). La figure 4.3 bénéficie d’une légende améliorée. Figure 4.3: Titre avec italique, maths (\\(\\sqrt\\pi\\)) et renvoi vers la figure 4.2 Le texte de fig.cap, “Titre de la figure” précédemment, est remplacé par (ref:pressure) à l’intérieur des guillemets qui sont conservés et la légende est saisie dans un paragraphe commençant par (ref:pressure) suivi d’un espace. Les légendes sont limitées à un paragraphe unique. Si une table des figures est utilisée (option lof: true dans l’entête), une légende courte est nécessaire en plus de la légende complète. Elle est déclarée dans fig.scap. Les figures qui ne sont pas créées par R mais proviennent de fichiers sont intégrées dans un bout de code par la fonction include_graphics() dont l’argument est le fichier contenant l’image à afficher. Placer systématiquement ces fichiers dans le dossier images pour une bonne organisation. 4.3.1.3 Tableaux Les séparateurs horizontaux - et verticaux | permettent de dessiner un tableau selon la syntaxe de Markdown, mais ce n’est pas la meilleure méthode. Les tableaux peuvent aussi être produits par du code R. Le contenu du tableau est dans un dataframe. La fonction kable du package knitr prépare le tableau pour l’affichage et passe le résultat à la fonction kable_styling du package kableExtra pour le formatage final. library("tidyverse") mes_iris <- head(iris) names(mes_iris) <- c("Longueur sépales ($l_s$)", "Largeur", "Longueur pétales", "Largeur", "Espèce") knitr::kable(mes_iris, caption = "Tableau créé par kable", booktabs = TRUE, escape = FALSE) %>% kableExtra::kable_styling(bootstrap_options = "striped", full_width = FALSE) Table 4.1: Tableau créé par kable Longueur sépales (\\(l_s\\)) Largeur Longueur pétales Largeur Espèce 5.1 3.5 1.4 0.2 setosa 4.9 3.0 1.4 0.2 setosa 4.7 3.2 1.3 0.2 setosa 4.6 3.1 1.5 0.2 setosa 5.0 3.6 1.4 0.2 setosa 5.4 3.9 1.7 0.4 setosa La légende est précisée par l’argument caption et le référencement est possible parce que le tableau reçoit une étiquette dont le nom est tab: suivi du nom du bout de code (tableau 4.1). Comme pour les figures, une légende améliorée peut être écrite dans un paragraphe séparé. Une légende courte pour une éventuelle liste des tableaux (option lot: true dans l’entête) est déclarée dans l’argument caption.short de kable(). Utiliser systématiquement l’argument booktabs = TRUE pour que l’épaisseur des lignes de séparation soit optimale en LaTeX. Comme le tableau contient des mathématiques (dans le nom de la première colonne), l’option escape = FALSE est nécessaire. L’option de style bootstrap_options = \"striped\" fournit des tableaux plus lisibles en HTML. Enfin, l’option full_width = FALSE permet d’ajuster la largeur du tableau à son contenu au lieu d’occuper toute la largeur disponible. Le package flextable permet de réaliser des tableaux plus élaborés, comme dans l’exemple suivant qui affiche en couleur les longs sépales. library("flextable") ## ## Attaching package: 'flextable' ## The following objects are masked from 'package:spatstat.geom': ## ## border, rotate ## The following object is masked from 'package:purrr': ## ## compose ## The following objects are masked from 'package:kableExtra': ## ## as_image, footnote # Rappel du jeu de données initial iris iris %>% # Premières lignes head() %>% # Création d'un objet flextable flextable() %>% # Titre des colonnes set_header_labels(Sepal.Length = "Longueur sépales", Sepal.Width = "Largeur", Petal.Length = "Longueur pétales", Petal.Width = "Largeur", Species = "Espèce") %>% # Sélection des longs sépales (>5) et affichage en # rouge color(~Sepal.Length > 5, ~Sepal.Length, color = "red") .tabwid table{ border-spacing:0px !important; border-collapse:collapse; line-height:1; margin-left:auto; margin-right:auto; border-width: 0; display: table; margin-top: 1.275em; margin-bottom: 1.275em; border-color: transparent; } .tabwid_left table{ margin-left:0; } .tabwid_right table{ margin-right:0; } .tabwid td { padding: 0; } .tabwid a { text-decoration: none; } .tabwid thead { background-color: transparent; } .tabwid tfoot { background-color: transparent; } .tabwid table tr { background-color: transparent; } .cl-f1dd85ea{}.cl-f1d35a48{font-family:'Helvetica';font-size:11pt;font-weight:normal;font-style:normal;text-decoration:none;color:rgba(0, 0, 0, 1.00);background-color:transparent;}.cl-f1d35a84{font-family:'Helvetica';font-size:11pt;font-weight:normal;font-style:normal;text-decoration:none;color:rgba(255, 0, 0, 1.00);background-color:transparent;}.cl-f1d37d2a{margin:0;text-align:right;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:5pt;padding-top:5pt;padding-left:5pt;padding-right:5pt;line-height: 1;background-color:transparent;}.cl-f1d37d52{margin:0;text-align:left;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:5pt;padding-top:5pt;padding-left:5pt;padding-right:5pt;line-height: 1;background-color:transparent;}.cl-f1d5876e{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f1d58778{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f1d58782{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 2pt solid rgba(102, 102, 102, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f1d58783{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 2pt solid rgba(102, 102, 102, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f1d5878c{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 2pt solid rgba(102, 102, 102, 1.00);border-top: 2pt solid rgba(102, 102, 102, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f1d5878d{width:54pt;background-color:transparent;vertical-align: middle;border-bottom: 2pt solid rgba(102, 102, 102, 1.00);border-top: 2pt solid rgba(102, 102, 102, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;} Longueur sépalesLargeurLongueur pétalesLargeurEspèce5.13.51.40.2setosa4.93.01.40.2setosa4.73.21.30.2setosa4.63.11.50.2setosa5.03.61.40.2setosa5.43.91.70.4setosa La documentation du package56 est disponible en ligne, ainsi qu’une galerie57. flextable ne supporte pas la numérotation des légendes hormis dans les documents Word. Cette limite est rédhibitoire. 4.3.1.4 Maths Les équations au format LaTeX peuvent être insérées en ligne, comme \\(A=\\pi r^2\\) (code: $A=\\pi r^2$) ou isolées (les $ sont doublés) comme \\[e^{i \\pi} = -1.\\] Elles peuvent être numérotées: voir équation (4.1), en utilisant l’environnement \\equation. \\[\\begin{equation} A = \\pi r^2. \\tag{4.1} \\end{equation}\\] L’équation numérotée est créée par le code suivant: \\begin{equation} A = \\pi r^2. (\\#eq:disque) \\end{equation} 4.3.1.5 Références croisées Les figures et tableaux ont une étiquette générée automatiquement, identique au nom du bout de code préfixé par fig: et tab:. Pour les équations, l’étiquette est ajoutée manuellement par le code (\\#eq:xxx) avant la fin de l’équation. Les sections peuvent recevoir une étiquette en terminant leur titre par {#yyy}. Les sections reçoivent par défaut une étiquette implicite58 correspondant à leur texte, en minuscules, où les caractères spéciaux sont remplacés par des tirets. Les étiquettes implicites sont instables (elles changent avec le titre de la section) et difficiles à prévoir: c’est pourquoi il est conseillé d’ajouter une étiquette explicite à chaque section faisant l’objet d’un renvoi. C’est le cas des chapitres, pour lesquels le nom du fichier HMTL produit est identique à l’étiquette. Les étiquettes de chapitres doivent respecter les règles de nomenclature des fichiers en ne contenant pas de caractères spéciaux. Des signets peuvent aussi être placés librement dans le texte avec la commande (ref:zzz). Dans tous les cas, l’appel à la référence est fait par la commande \\@ref(ref:zzz). 4.3.1.6 Bibliographie Les références bibliographiques au format bibtex doivent être incluses dans le fichier .bib déclaré dans l’entête du document Markdown. bibliography: references.bib Ce fichier peut être créé et maintenu à jour par Zotero installé avec l’extension Better BibTeX (voir section 1.6). Il suffit pour cela de créer une collection Zotero correspondant au projet et d’y glisser les références pertinentes. Utiliser ensuite le menu contextuel “Exporter la collection…” et sélectionner: Format: “Better BibTeX” pour les articles et présentations ou “Better BibLaTeX” pour les mémoires, selon que la bibliographie est gérée par bibtex et natbib ou biber et biblatex pour la production de documents PDF. Cocher la case “Garder à jour” pour que toute modification dans Zotero soit exportée automatiquement. Cliquer sur “OK” puis choisir le nom du fichier (references.bib) et son emplacement (le dossier du projet R). Les références peuvent être appelées dans le texte, entre parenthèses par le code [@Reference], ou dans le texte, en supprimant les crochets. La bibliographie est traitée par pandoc lors de la production de documents Word ou HTML. Le style bibliographique peut être précisé, en ajoutant la ligne csl:nom_du_fichier.csl dans l’entête du document et en copiant le fichier de style .csl dans le dossier du projet. Plus d’un millier de styles sont disponibles59. Pour les documents PDF, la bibliographie est gérée par LaTeX. Pour préparer la soumission d’un manuscrit à une revue, il faudra ouvrir le fichier .tex intermédiaire produit par pandoc et copier le contenu de l’environnement {document} dans le modèle proposé par la revue, qui se chargera du formatage. 4.3.1.7 Langues Les langues sont à déclarer dans l’entête des document produits par les modèles de memoiR. La langue principale du document modifie le nom de certains éléments, comme la table des matières. Les langues supplémentaires permettent la rédaction de documents multilingues. Les champs de l’entête sont: lang: fr-FR otherlangs: [en-US, it] Le changement de langue dans le document est géré en LaTeX mais pas en HTML en insérant sur une nouvelle ligne la commande suivante : \\selectlanguage{english} La langue en cours n’a d’effet que dans les sorties LaTeX: un espace est ajouté devant les ponctuations doubles en Français, la taille des espaces est plus grande en début de phrase en Anglais, etc. La commande \\selectlanguage est simplement ignorée en HTML. Les noms de langues sont différents dans l’entête (codes IETF) et dans le texte (nom de la langue). La correspondance et la liste complète des langues se trouve dans le tableau 3 de la documentation du package polyglossia60. 4.3.2 Modèle Simple Article Le modèle Simple Article de memoiR produit un document HTML simple avec une table des matières flottante (voir l’exemple61). D’autres formats HTML sont disponibles: voir la gallerie62 du package. Le format PDF est proche du modèle article de LaTeX (exemple63). Le modèle contient sa propre documentation. 4.3.2.1 Créer Utiliser le menu “File > New File > R Markdown…” puis sélectionner “From template” (figure 4.1). La liste des modèles disponible et le package qui les propose est alors affichée. Sélectionner le modèle Simple Article du package memoiR, choisir le nom du projet (“Name:”, qui sera le nom du dossier dans lequel il sera créé, et son dossier parent (“Location:”). Dans l’organisation proposée en section 1.2.4, le dossier parent est %LOCALAPPDATA%\\ProjetsR. Le nom du projet ne doit contenir aucun caractère spécial (accent, espace…) pour assurer sa portabilité sur tous les systèmes d’exploitation (Windows, Linux, MacOS). Les modèles élaborés créent un dossier avec de nombreux fichiers (bibliographie, styles, modèle LaTeX…), contrairement aux modèles simples qui créent seulement un fichier. Quand un dossier est créé, par exemple par le modèle Simple Article, il faut en faire un projet RStudio: dans le menu des projets (en haut à droite de la fenêtre de RStudio), utiliser le menu “New Project…” puis “Existing Directory” et sélectionner le dossier qui vient d’être créé. 4.3.2.2 Ecrire Les instructions pour utiliser le modèle sont contenues dans le texte fourni par défaut. 4.3.2.3 Tricoter Le document peut être tricoté en plusieurs formats: html_document2 est le format HTML pour lequel le modèle a été conçu: un bloc-note avec une table des matières flottante; gitbook est un format HTML alternatif, utilisé normalement pour les ouvrages; downcute est un format HTML proposé par le package rmdformats; pdf_book produit un document PDF suivant le modèle LaTeX article, couramment utilisé directement en LaTeX; word_document2 crée un ficher Word. 4.3.2.4 Mettre en ligne Le package memoiR simplifie la mise en ligne des documents produits. La fonction build_gitignore() crée un fichier .gitignore pour le contrôle de source qui doit être activé (voir section 3.1.1). La fonction build_readme() crée un fichier README.md nécessaire à GitHub. Il contient le titre du projet, son résumé et des liens vers les versions HTML et PDF des documents produits. Le projet doit être lié à un dépôt GitHub (section 3.2). Deux stratégies de publications sont possible. Dans la première, les documents sont tricotés localement et placés dans le dossier docs, qui sera le support des pages GitHub. Dans la seconde, les documents sont tricotés par GitHub Actions à chaque fois que des modifications sont poussées sur le dépôt: on parle d’intégration continue (section 6). La stratégie de production locale est traitée ici; l’intégration continue le sera dans la section 6.3.1. La fonction build_githubpages() place tous les documents tricotés (HTML et PDF) dans le dossier docs, avec une copie du fichier README.md. De cette façon, il est possible d’activer les pages GitHub du projet (sur le dossier docs de la branche master). Le fichier README.md sera la page d’accueil du site web produit. En pratique, on tricote au format HTML pendant toute la phase de rédaction, parce que la production est très rapide. Quand le document est stabilisé, il faut le tricoter au format HTML et au format PDF. Enfin, l’exécution de build_githubpages() place tous les fichiers produits dans docs. Il reste à pousser le dépôt sur GitHub et activer les pages GitHub. 4.3.3 Autres modèles Le modèle Stylish Article de memoiR est destiné à la production d’articles PDF pour l’autoarchivage (typiquement, le dépôt sur HAL) bien formatés, au format A4 en double colonne64. Le format HTML est le même que celui du modèle Simple Article. Le package rticles a pour ambition de fournir des modèles pour toutes les revues scientifiques qui acceptent une soumission d’articles en LaTeX. Il propose donc des modèles Markdown qui produisent des fichiers PDF conformes aux exigences des revues et la possibilité de récupérer le fichier .tex intermédiaire (pandoc produit un fichier .tex transmis au compilateur LaTeX). Le package ne permet pas de tricot HTML parce qu’il utilise la syntaxe LaTeX dans le document R Markdown au lieu d’utiliser bookdown pour gérer les références bibliographique et les références croisées. Il n’est pas possible d’échanger directement du contenu R Markdown standard avec des documents écrits pour rticles, ce qui limite beaucoup l’intérêt du package. 4.4 Présentation Beamer Le modèle Beamer Presentation de memoiR permet de créer des présentations au format HTML et PDF (beamer) simultanément, comme le montre l’exemple65. La démarche est identique à celle des articles du même package. Les niveaux de titre permettent de séparer les parties de la présentation (#) et les diapositives (##). Deux formats sont disponibles en HTML: ioslides66 et Slidy67. Quelques spécificités dans le code permettent d’affiner la présentation des diapositives, pour un affichage sur deux colonnes par exemple: elles sont documentées dans le modèle. 4.5 memoir Le modèle Memoir du package memoiR est destiné aux documents longs, qui présentent une différence importante avec les documents précédents: un document long est composé de plusieurs chapitres, chacun placé dans son fichier .Rmd. Le format HTML est gitbook68, le standard de la lecture en ligne de documents de ce type. Le format PDF est dérivé du modèle LaTeX memoir69, optimisé aussi pour les documents longs. Ce document a été écrit avec ce modèle. 4.5.1 Créer La création d’un projet d’ouvrage est identique à celle présentée plus haut: le modèle est: Memoir. Le dossier créé doit être transformé en projet. Exécuter build_git() et build_readme(), activer le contrôle de source et pousser le projet sur GitHub, de la même façon que pour un article (section 4.3.2.4). Chaque chapitre de l’ouvrage est un fichier Rmd, dont le nom commence normalement par son numéro (ex.: 01-intro.Rmd). Tous les fichiers Rmd présents dans le dossier du projet sont en réalité traités comme des chapitres, triés par ordre de nom de fichier, dont ceux fournis par le modèle (démarrage et syntaxe) qui doivent être supprimés à l’exception de 99-references.Rmd qui contient la bibliographie, placée à la fin. Le fichier index.Rmd est particulier: il contient l’entête du document et le premier chapitre. 4.5.2 Ecrire Le premier chapitre est placé dans l’avant-propos de l’ouvrage imprimé: il ne doit pas être numéroté (d’où le code {-} à côté du titre) dans la version HTML. Il se termine obligatoirement par la commande LaTeX \\mainmatter qui marque le début du corps de l’ouvrage. Les niveaux de plan commencent par # pour les chapitres (un seul par fichier), ## pour les sections, etc. 4.5.3 Tricoter La compilation au format PDF est faite par XeLaTeX, qui doit être installé. Pendant la rédaction, il est fortement conseillé de ne créer que le fichier HTML, ce qui est beaucoup plus rapide qu’une compilation LaTeX. Chaque chapitre peut être visualisé très rapidement en cliquant sur le bouton “Knit” au-dessus de la fenêtre de source. Le livre entier est créé en cliquant sur le bouton “Build Book” de la fenêtre Build de RStudio. La liste déroulante du bouton permet de créer tous les documents ou de se limiter à un format. Les fichiers produits sont placés directement dans le dossier docs, qui sera utilisé par les pages GitHub pour permettre la lecture en ligne et le téléchargement du PDF. La page d’accueil du site web est créée par bookdown à partir du fichier index.Rmd: le fichier README.md n’est pas dupliqué dans docs. 4.5.4 Finitions La mise en page est assurée de façon totalement automatique par pandoc (en HTML) et LaTeX (en PDF). Il est souvent utile d’aider LaTeX à résoudre quelques dépassements de marge dus à de trop grandes contraintes de mise en page: pour la lisibilité optimale, les colonnes sont étroites, mais le code (texte formaté entre deux apostrophes inversées) n’autorise pas la césure. Si une ligne de texte dépasse dans la marge de droite dans le document PDF, la solution consiste à ajouter manuellement le code \\break à l’emplacement désiré pour le retour à la ligne dans le document R Markdown. La commande n’a aucun effet sur le document HTML mais force la césure en LaTeX. Pour couper du texte formaté (entre astérisques pour l’italique ou plus fréquemment entre apostrophes inversées pour du code), il faut terminer le formatage avant \\break et le recommencer après. Exemple, pour forcer le retour à la ligne avant fichier.Rmd: Le fichier `/chemin/`\\break`fichier.Rmd` En HTML, un espace sera ajouté entre les deux portions de code. Les bouts de code R sont formatés automatiquement par knitr quand l’option tidy=TRUE leur est appliquée. Le comportement par défaut est indiqué dans les options de knitr, dans un bout de code au début du fichier index.Rmd: # knitr options knitr::opts_chunk$set( cache=TRUE, warning=FALSE, echo = TRUE, fig.env='SCfigure', fig.asp=.75, fig.align='center', out.width='80%', tidy=TRUE, tidy.opts=list(blank=FALSE, width.cutoff=55), size="scriptsize", knitr.graphics.auto_pdf = TRUE) La largeur maximale d’une ligne de code formaté est ici de 55 caractères, optimal pour le modèle. Il arrive que le formatage automatique ne fonctionne pas parce que knitr ne parvient pas à trouver une coupure de ligne respectant toutes les contraintes, ce qui provoque un dépassement de marge dans le code. Dans ce cas, formater manuellement le bout de code en lui ajoutant l’option tidy=FALSE. Les blocs de code littéral, délimités par trois apostrophes inversées, doivent être formatés manuellement, en évitant toute ligne de plus de 55 caractères. 4.5.5 Site gitbook Le site web contenant le document gitbook doit être paramétré dans _output.yml pour que : Le titre du document apparaisse en haut de la table des matières; Une indication de l’usage de GitHub et bookdown soit affichée en bas de la table des matières; Un bouton GitHub dans la barre de titre permette d’ouvrir le dépôt du projet; Un autre bouton permette de télécharger le document PDF. Le fichier _output.yml de ce document est le suivant: bookdown::gitbook: css: style.css config: sharing: github: yes facebook: false twitter: false toc: before: | <li><a href="./">Travailler avec R</a></li> after: | <li> <a href="https://github.com/EricMarcon/travailleR" target="blank"> Hébergé sur GitHub, publié par bookdown </a> </li> download: pdf La section sharing: gère les boutons de la barre de titre. Par défaut, les liens vers Facebook et Twitter sont activés mais celui vers GitHub ne l’est pas. Pour qu’il fonctionne, le dépôt GitHub doit être déclaré dans l’entête du fichier index.rmd: github-repo: EricMarcon/travailleR La section toc: contient deux portions de code HTML dans lesquelles le titre du document et le lien vers son dépôt GitHub doivent être adaptés au projet. Enfin, la section download: liste les formats de documents téléchargeables et permet d’afficher un bouton de téléchargement dans la barre de titre. 4.5.6 Intégration continue La construction d’un ouvrage prend du temps, surtout s’il contient des calculs. Elle doit être lancée au format gitbook et au format PDF. En production, elle peut être confiée à GitHub (chapitre 6.3.2). 4.5.7 Google Analytics Le suivi de l’audience de l’ouvrage peut être confié à Google Analytics. Pour cela, il faut créer un compte et ajouter une propriété Google Analytics, c’est-à-dire un site web, puis un flux de données, ici un flux web70. Google Analytics fournit un script de configuration nommé gtag.js à placer à la racine du dossier du projet. Enfin, déclarer le script dans l’entête des pages web en ajoutant une instruction dans _output.yml, dans sa première section. bookdown::gitbook: includes: in_header: gtag.js 4.6 Site web R Markdown Un site web constitué de pages écrites avec R Markdown (sans les fonctionnalités de bookdown) et un menu peut être créé très simplement, avec un résultat de bonne facture71. 4.6.1 Modèle Dans RStudio, dans le menu des projets en haut à droite, cliquer sur “New Project…” puis “New Directory” puis “Simple R Markdown website”. Saisir le nom du projet, sélectionner le dossier dans lequel le projet sera créé en cliquant sur “Browse” et enfin cliquer sur “Create Project”. Le site par défaut contient deux pages: index, la page d’accueil, et about, la page “A propos”. Le fichier _site.yml contient le nom du site et le contenu de sa barre de navigation: un titre et le fichier correspondant. D’autres pages seront ajoutées en créant de nouveaux fichiers .Rmd et en les ajoutant au fichier _site.yml. 4.6.2 Améliorations Le modèle de site peut facilement être amélioré en complétant _site.yml: en ajoutant une icône GitHub dans la barre de navigation pour renvoyer vers le code source du site: en choisissant la méthode de tricot des pages, pour utiliser bookdown au lieu de rmarkdown; en plaçant les fichiers du site dans le dossier docs et ainsi séparer le code et la production. Le fichier _site.yml complété est le suivant: name: "my-website" navbar: title: "My Website" left: - text: "Home" href: index.html - text: "About" href: about.html right: - icon: fa-github href: https://github.com/rstudio/rmarkdown output_dir: "docs" output: bookdown::html_document2: theme: sandstone highlight: tango toc: true toc_float: yes L’icône de GitHub fait partie de la collection Font Awesome dont toutes les icônes gratuites72 sont utilisables avec la même syntaxe: “fa-nom”. Le lien correspondant à l’icône doit être celui du dépôt GitHub du site web. La syntaxe de la section output est la même que celle des documents vus plus haut. Elle s’applique à toutes les pages (dont l’entête YAML est réduite au minimum). Les thèmes disponibles sont ceux de rmarkdown73. L’option highlight indique la façon dont le code R éventuellement affiché sera formaté. Enfin, la table des matières est flottante, ce qui signifie que sa position s’ajuste quand la fenêtre défile. 4.6.3 Contôle de source Le projet doit être placé sous contrôle de source et poussé sur GitHub (chapitre 3). Le fichier .gitignore est le suivant: # R .Rbuildignore .RData .Rhistory .Rprofile .Rproj.user # Web Site /_site/ /*_cache/ /*_files/ Activer les pages GitHub (section 3.6) sur le dossier docs pour héberger le site. Ajouter un fichier vide nommé .nojekyll dans docs pour que les pages GitHub ne tentent pas de reformater le site. On peut utiliser le terminal de RStudio pour exécuter: touch docs/.nojekyll 4.7 Site web personnel : blogdown Pour créer une page web personnelle, Hugo est un générateur de site statique capable de produire des pages HTML à partir de code Markdown. Les sites statiques ont l’avantage, en comparaison aux sites dynamiques gérés par un système de gestion de contenu (CMS, par exemple: Wordpress, Joomla, SPIP), d’être portables sur n’importe quel serveur web sans support de base de données ni de code à exécuter côté le serveur (tel que PHP) et d’être très rapides puisque les pages sont créées une seule fois et non à chaque consultation. Un site Hugo peut être hébergé par exemple sur la page personnelle de tout utilisateur de GitHub dont l’adresse est de la forme “NomUtilisateur.github.io”. Hugo propose de nombreux thèmes, qui sont des modèles de structure de sites, donc le thème Academic, destiné aux chercheurs. Dans RStudio, le package blogdown est prévu pour produire facilement des pages web avec Hugo. Ces pages peuvent contenir du code R: elles sont très proches d’un article, vu plus haut, dont le contenu peut être facilement copié et collé. Nous utiliserons donc cette solution, pour un site comme celui proposé en exemple74. La structure du site web est simple: une page d’accueil, contenant divers composants paramétrables comme la biographie de l’auteur, une sélection de publications, de billets de blogs ou d’autres éléments et un formulaire de contact; des pages détaillant les divers éléments (publications, billets, etc.) écrites en R Markdown. 4.7.1 Installation des outils La première étape consiste à installer le package blogdown dans R. install.packages("blogdown") blogdown est capable d’installer Hugo sous Windows, macOS ou Linux. blogdown::install_hugo() La documentation complète de blogdown est disponible75. Les versions récentes de Hugo utilisent Go (le langage de programmation) pour installer leurs modules à la volée: ici le thème Academic est chargé depuis GitHub au moment de la création du site. Go doit donc être installé76. 4.7.2 Créer La façon la plus simple consiste à créer un dépôt sur GitHub à partir du modèle. Sur la page du dépôt starter-academic77, cliquer sur le bouton “Use this template”, s’authentifier éventuellement sur GitHub, puis saisir le nom du dépôt qui contiendra le projet, par exemple “MySite”. Le dépôt peut être celui du site principal de son compte GitHub (voir section 3.6), à l’adresse https://GitHubID.github.io78. Le nom à saisir est simplement “GitHubID.github.io” (GitHubID est le nom du compte GitHub). Créer le dépôt. Copier l’adresse du dépôt en cliquant sur le bouton “Code” puis sur le bouton à droite de l’adresse (figure 4.4). Figure 4.4: Copie de l’adresse d’un dépôt à cloner sur GitHub. Dans RStudio, créer un nouveau projet à partir de GitHub: dans le menu des projets en haut à droite, cliquer sur “New Project…” puis “Version Control” puis “Git” puis coller l’adresse dans le champ “Repository URL” (figure 4.5). Sélectionner le dossier dans lequel le projet sera créé en cliquant sur “Browse” et enfin cliquer sur “Create Project”. Figure 4.5: Collage de l’adresse du dépôt à cloner. Le projet créé est une copie exacte du modèle, qui doit être personnalisée. RStudio ajoute automatiquement à la fin du fichier .gitignore une ligne pour ignorer ses fichiers de travail (dossier .Rproj.user). Ajouter une ligne de commentaire pour le signaler. Le contenu de .gitignore doit être le suivant: # R .Rbuildignore .RData .Rhistory .Rprofile .Rproj.user # Hugo /resources/ /public/ # blogdown /static/en/ /static/fr/ *.rmarkdown _index.html index.html **/index_files/ Un bug de blogdown nécessite de déplacer le fichier config.toml du dossier config/_default/ à la racine du projet. Prendre en compte ces modification dans git en faisant un commit. 4.7.3 Site personnel sur GitHub Si le site doit être le site principal de son compte GitHub (voir section 3.6), son code doit être placé dans une autre branche que master, qui est destinée à l’affichage des pages produites. Quelques manipulations supplémentaires sont nécessaires à ce stade. La première consiste à créer une branche source pour le code (voir section 3.4). Exécuter dans le terminal de RStudio: git branch source git checkout source Si l’interface graphique de RStudio ne reflète pas le changement de branche, il faut quitter et relancer l’application. A partir de cette étape, tous les développements auront lieu dans la branche source. Elle n’a pas pour objectif d’être fusionnée avec la branche master. 4.7.4 Construction du site Exécuter blogdown::build_site(build_rmd = TRUE) pour construire le site web, y compris ses futures pages R Markdown. Pour afficher le site, exécuter : blogdown:::serve_site() Il apparaît dans la fenêtre Viewer de RStudio, dont le bouton d’agrandissement permet l’affichage dans le navigateur internet par défaut du système. Pour modifier le contenu du site, il est préférable d’arrêter le serveur web par la commande: blogdown:::stop_server() Le site produit par blogdown se trouve dans le dossier public qui peut être copié directement sur un serveur web qui l’hébergera. Une solution simple pour un site autre que le site principal du dépôt GitHub consiste à déclarer ce dossier comme racine des pages GitHub du projet (section 3.6). Pour le site principal, le contenu de public doit être copié à la racine de la branche master. Cette opération sera réalisée par intégration continue: voir section 6.3.4. Pour le faire manuellement, suivre les étapes suivantes: afficher la branche master. Le répertoire public est ignoré par gitignore donc il n’est pas modifié; dans la branche master, supprimer tout le contenu original devenu inutile puisque le code est traité dans la branche source. Conserver les fichiers et dossiers commençant par un point (paramètres de git, GitHub et RStudio), les dossiers ignorés (public, ressources et static) et supprimer le reste; déplacer le contenu de public vers la racine du projet; valider par un commit; pousser le projet sur GitHub; vérifier le bon affichage du site sur https://GitHubID.github.io. 4.7.5 Site multilingue Si le site est multilingue (Français et Anglais par exemple), son contenu (dossier content) doit être copié dans un dossier correspondant à chaque langue. Par exemple, le fichier content/authors/admin/_index.md qui contient les informations sur le propriétaire du site est remplacé par content/en/authors/admin/_index.md et content/fr/authors/admin/_index.md si le site supporte l’Anglais et le Français. En pratique, créer un dossier en et un dossier fr dans content. Copier tout le contenu de content (sauf les deux nouveaux dossiers) dans en puis déplacer ce même contenu dans fr. 4.7.6 Paramétrer Les fichiers de configuration du site sont bien documentés et offrent de nombreuses options. Les principales sont passées en revue ici pour une création rapide d’un site fonctionnel. Le fichier config.toml contient les paramètres généraux du site. Les lignes à mettre à jour sont celle du titre du site (le nom du propriétaire puisqu’il s’agit d’un site personnel) et son adresse publique. Pour le site exemple : title = "Eric Marcon" baseurl = "https://EricMarcon.github.io/" Il contient aussi la ligne de sélection de la langue par défaut (“en” ou “fr” au choix) et celle qui permet de placer les fichiers produits par Hugo dans chaque dossier de langue (“true” obligatoirement pour un site multilingue): defaultContentLanguage = "fr" defaultContentLanguageInSubdir = true Le dossier config/_default/ contient les autres fichiers de configuration. languages.toml contient les paramètres linguistiques et les traductions de menus. Pour chaque langue, la version utilisée et le dossier de contenu sont précisés: [en] languageCode = "en-us" contentDir = "content/en" [fr] languageCode = "fr-fr" contentDir = "content/fr" Pour les langues additionnelles, le titre du site, les paramètres d’affichage des dates et la traduction des menus sont ajoutés. Dans la section [fr]: [fr] languageCode = "fr-fr" contentDir = "content/fr" title = "Eric Marcon" description = "Page personnelle d'Eric Marcon" [fr.params] description = "" date_format = "02-Jan-2006" time_format = "15:04" [[fr.menu.main]] name = "Accueil" url = "#about" weight = 20 (...) Ces lignes sont commentées dans le modèle et doivent dont être décommentées en retirant les # en têtes de lignes. Les menus sont décrits plus bas. params.toml décrit l’aspect du site. Les options sont regroupées par sujet, par exemple “Theme” pour l’apparence générale. Dans “Basic Info”, la ligne site_type = "Person" sélectionne un site personnel. Il est possible d’utiliser Academic pour un site de projet scientifique ou un site d’unité, non documentés en détail ici. Les principales différences sont, pour un site collectif: la gestion des auteurs: dans le dossier /contents/<langue>/authors, un seul dossier admin est utilisé pour un site personnel alors qu’un dossier par personne est nécessaire pour un site collectif; un composant décrit plus bas, qui permet de présenter les personnes, doit être activé. La description du site dans la langue par défaut est saisie, à destination des moteurs de recherche: description = "Eric Marcon's Homepage" Elle doit être traduite dans le fichier languages.toml, dans chaque langue. Dans “Site Features”, nous sélectionnons la coloration du code R, l’activation du formatage des équations et l’avertissement légal pour l’utilisation des cookies. highlight_languages = ["r"] math = true privacy_pack = true La ligne edit_page doit être mise à jour: remplacer le dépôt par défaut “https://github.com/gcushen/hugo-academic” par celui du site. “Contact details” contient les informations pour contacter le propriétaire du site. Elles doivent être saisies. “Regional Settings” contient les paramètres d’affichage de date pour la langue par défaut (ceux des autres langues sont dans languages.toml). Ils n’ont normalement pas à être modifiés. “Comments” permet d’activer les commentaires des visiteurs en bas de pages, avec Disqus ou Comment.io (un compte est nécessaire chez le fournisseur). “Marketing” permet d’activer le suivi de fréquentation du site en saisissant simplement son identifiant Google Analytics (à créer avec un compte Google). “Content Management System” contient la ligne netlify_cms dont la valeur doit être false si le site n’est pas hébergé par Netlify. Enfin “Icon Pack Extensions” permet d’activer les icônes Academicons si nécessaire. 4.7.7 Ecrire Utiliser la documentation en ligne79 en complément des informations principales détaillées ici. L’exemple utilisé ici est le site personnel de l’auteur80. La méthode de travail consiste à progresser pas à pas en testant puis validant chaque étape: Effectuer les modifications; Construire le site et vérifier le résultat: blogdown:::serve_site(); Arrêter le site: blogdown::stop_server(); Si le résultat n’est pas satisfaisant, recommencer; Valider les modifications (commit). 4.7.7.1 Page d’accueil La page d’accueil du site est constituée par une suite d’éléments (widgets) qui se trouvent dans /contents/<langue>/home. Chaque élément est décrit par un fichier markdown. Le premier est index.md. Il n’est normalement jamais modifié. Son contenu est le suivant: +++ # Homepage type = "widget_page" headless = true # Homepage is headless, other widget pages are not. +++ Le fichier ne contient qu’un entête au format TOML, encadré par une ligne de +++. Le type de composant (type) indique qu’il s’agit d’une page de composants, dans laquelle les autres composants du dossier trouveront leur place. headless = true signifie que la page n’a pas d’en-tête. Figure 4.6: Composant demo dans Academic. Le composant demo.md (figure 4.6) est un composant de type “blank”, c’est-à-dire une page de texte libre: il sert ici à présenter le modèle Academic Kickstart et doit donc être désactivé. L’entête contient ses informations de formatage (titre, nombre de colonnes, couleurs…) et le contenu de la page est écrit en markdown. Les composants apparaissent par ordre croissant de poids (weight dans l’entête): 15 marque le premier composant dans le modèle Academic. Le composant peut être désactivé en supprimant son fichier ou en modifiant sa propriété active dans l’entête: active = false # Activate this widget? true/false Figure 4.7: Composant about dans Academic. Le composant suivant est about.md (figure 4.7). Il présente le propriétaire du site. Son titre doit être localisé. Dans le dossier /content/fr/home, sa valeur sera: title = "Biographie" L’auteur (author) doit correspondre à un dossier de /contents/<langue>/authors. admin convient parfaitement pour un site personnel. Academic permet de créer des sites d’équipes: dans cette configuration, un dossier par personne serait nécessaire. L’image affichée par le composant est le fichier avatar.jpg placé dans ce dossier. Limiter la taille du fichier pour la performance du site (moins d’un mégaoctet est une taille raisonnable), tout en assurant une taille minimale de quelques centaines de pixels de côté pour la qualité de l’affichage. Le contenu du composant est lu dans le fichier _index.md du même dossier, qui contient toutes les informations sur l’auteur. Son organisation est assez claire: modifier son contenu à partir de l’exemple fourni. Si des icônes de type ai sont utilisées, activer le pack d’icône Academicons dans config/_default/params.toml. Figure 4.8: Composant skills dans Academic. Le composant talents (skills, figure 4.8) présente les compétences de l’auteur de façon graphique. Une collection d’icônes est disponible, et des icônes nouvelles peuvent être ajoutées. Figure 4.9: Composant experience dans Academic. Le composant expérience (experience, figure 4.9) liste les expériences professionnelles. Toutes les informations sont saisies dans son entête. Le composant accomplishments présente les formations professionnelles et permet d’accéder à leurs certificats. Le composant posts va chercher son contenu dans le dossier /contents/<langue>/post qui contient les billets de blog (voir plus bas). Le fichier posts.md contient des options de mise en page dans son entête. Le composant projects fonctionne de la même façon. La différence entre les deux composants est leur mise en forme: posts est du type “pages”, qui affiche les éléments les plus récents, alors que projects est de type “portfolio”, qui affiche les éléments sélectionnés qui contiennent la description featured: true dans leur propre entête. Il est possible de créer des composants de ces types librement, en spécifiant le dossier contenant les éléments dans “page-type”. Exemple: créer un composant nommé software.md en renommant projects.md, modifier sa ligne page_type = \"software\" et créer un dossier /contents/<langue>/software pour y placer du contenu. Les composants publications et featured sont de type “pages” et “portfolio” respectivement et prennent leur contenu dans le dossier publication. Le composant tags présente un nuage de mots à partir des mots-clés déclarés dans tous les fichiers de contenu (billets de blog, publications…) sous la forme suivante dans leur entête: tags = ["Mot Clé 1", "Autre Mot Clé"] Enfin, le composant contact permet d’afficher un formulaire de contact. Il utilise les informations du fichier config/_default/params.toml dans sa partie commençant par: ############################ ## Contact details ## Pour afficher une carte, entrer la latitude et la longitude de l’adresse dans la ligne coordinates. Pour afficher un formulaire de messagerie, choisir le service formspree.io (email_form = 2 dans contact.md). Pour activer le service de messagerie, il faudra construire le site web, s’envoyer un premier message en utilisant le formulaire et suivre les instructions de Formspree. Le composant people est utilisé dans les sites collectifs pour présenter les membres. Le composant slider permet d’afficher un carrousel (des éléments défilants) en haut de page. Pour comprendre son fonctionnement, le plus simple consiste à l’activer. 4.7.7.2 Menu de la page d’accueil La page d’accueil comporte un menu qui permet de naviguer rapidement vers ses composants ou vers d’autres pages. Il est paramétré dans config/_default/menus.toml. Les éléments du menu ont un nom affiché, un lien (commençant par # pour pointer vers un composant ou un chemin relatif dans le site comme publication/), et un poids qui définit leur ordre d’affichage, de la même façon que celui des composants de la page d’accueil. Un menu à deux éléments pour pointer vers l’accueil du site et les billets de blogs est donc le suivant: [[main]] name = "Home" url = "#about" weight = 10 [[main]] name = "Posts" url = "#posts" weight = 20 Le menu doit être traduit dans chaque langue dans le fichier config/_default/languages.toml: [fr] [[fr.menu.main]] name = "Accueil" url = "#about" weight = 10 [[fr.menu.main]] name = "Articles" url = "#posts" weight = 20 4.7.7.3 Billets Le site est alimenté par des billets de blog placés dans le dossier /contents/<langue>/post. Il doivent être traduits et placés dans le dossier post de chaque langue pour être disponibles dans la langue correspondante. L’exemple utilisé ici est un guide pour estimer correctement la densité d’une variable bornée81. Son code est sur GitHub82. Un billet est placé dans un dossier (/content/fr/post/densite) qui contient son code R Markdown et éventuellement des images, des données pour alimenter le code et d’autres éléments appelés par le code. Hugo supporte des fichiers markdown natifs. L’apport de blogdown relativement à un site Hugo natif est le support de R Markdown, donc la possibilité d’exécuter tout code R comme dans un bloc-note (dont le contenu peut être réutilisé sans modification). Le fichier principal d’un billet est index.Rmd. blogdown crée un fichier index.html pendant la construction du site: il peut être ignoré (dans .gitgnore) et supprimé à tout moment. Si une image featured.png (optimale pour un schéma) ou featured.jpg (optimale pour un photo) est placée dans le dossier, elle sera utilisée comme vignette du billet. index.Rmd comprend un entête au format yaml (entourée par des ---) ou toml (entourée par des +++) qui décrit son affichage: --- title: "Titre du billet" subtitle: "Sous-titre" summary: "Résumé" authors: [] tags: ["Mot Clé 1", "Autre Mot Clé"] categories: [] date: 2020-04-17 featured: false draft: false # Featured image # To use, add an image named `featured.jpg/png` to # your page's folder. # Focal points: Smart, Center, TopLeft, Top, TopRight, # Left, Right, BottomLeft, Bottom, BottomRight. image: caption: "" focal_point: "" preview_only: false bibliography: references.bib --- Les auteurs sont utilisés dans les sites collectifs. Les tags permettent d’alimenter le composant nuage de mots s’il est activé dans la page d’accueil. Les catégories permettent de rechercher des pages au contenu similaire (recherche par mot-clé sur le site). L’option featured: true fait apparaître le billet dans les composants de type featured sur la page d’accueil. L’option draft: true cache le billet. Les éléments suivants précisent l’affichage de la vignette: légende et position. L’option preview_only: true limite l’affichage aux miniatures (sur la page d’accueil), retirant donc l’image du billet lui-même. Les éléments d’entête nécessaires au corps de texte R Markdown, comme le nom du fichier contenant les références bibliographiques, placé dans le même dossier, sont ajoutés. Le corps du texte est celui d’un document R Markdown standard, avec du code R inclus. Un bout de code initial permet de fixer les options de R et charger les packages nécessaires. En pratique, la façon la plus efficace de créer un nouveau billet est de copier le dossier complet d’un billet précédent, de le renommer et de modifier son contenu. La commande blogdown::new_post() peut aussi être utilisée mais ne gère pas les langues multiples (et crée donc le billet dans le dossier /contents/post à moins de préciser l’argument subdir). La reconstruction du site ne met par défaut pas à jour les pages basées sur un fichier .Rmd. Pour le faire, il faut forcer la commande build_site(). blogdown::build_site(build_rmd = TRUE) blogdown::serve_site() 4.7.7.4 Publications Les publications sont organisées comme les billets, mais placées dans le dossier /contents/<langue>/publications. L’exemple utilisé est un article de revue83 avec son code84. Un fichier cite.bib contenant la référence au format BibTex est placé dans le dossier. Le nom du dossier est de préférence celui de l’identifiant de la publication. L’entête du fichier index.md (ici au format Markdown, mais .Rmd est possible si du code R est nécessaire) contient les mêmes informations que le fichier BibTex, mais au format approprié (yaml), et les éléments propres à Academic (featured): --- title: "Evaluating the geographic concentration of |> industries using distance-based methods" authors: ["Eric Marcon", "Florence Puech"] publication_types: ["2"] abstract: "We propose (...)" publication: "*Journal of Economic Geography*" doi: "10.1093/jeg/lbg016" date: 2003-10-01 featured: false --- Les types de publication sont: 0 = Uncategorized; 1 = Conference paper; 2 = Journal article; 3 = Preprint / Working Paper; 4 = Report; 5 = Book; 6 = Book section; 7 = Thesis; 8 = Patent. Des boutons sont affichés en haut de la page de la publication en fonction des informations trouvées : PDF: si la ligne url est présente dans l’en-tête; Citation: si le fichier cite.bib est présent dans le dossier; DOI: si la ligne doi est présente dans l’en-tête. Le corps de la publication contient un lien (au format HTML) vers le site Dimension qui fournit des informations bibliométriques. Ce lien peut être réutilisé très simplement, en remplaçant simplement le DOI du document: <span class="__dimensions_badge_embed__" data-doi="10.1093/jeg/lbg016"></span> <script async src="https://badge.dimensions.ai/ badge.js" charset="utf-8"></script> Enfin, un fichier /contents/<langue>/publications/_index.Rmd permet de présenter la bibliographie complète. Il est accessible à partir du composant publications de la page d’accueil qui affiche un lien “Plus de Publications”. Le fichier exemple85 avec son code86 permet d’interroger Google Scholar pour obtenir le réseau de coauteurs, l’indice h et le nombre de citations annuelles de l’auteur. Il est réutilisable en modifiant simplement l’identifiant Google Scholar à la ligne 30. En faisant exécuter le code régulièrement, par exemple par GitHub (voir ci-dessous), les statistiques affichées sont maintenues à jour sans intervention humaine. 4.7.7.5 Communications Les communications sont organisées comme les publications, dans le dossier /contents/<langue>/talk. L’exemple utilisé est une communication en Français, donc dans /contents/fr/talk87 avec son code88. Une image peut être utilisée plus facilement que pour une publication. L’entête contient des lignes particulières adaptées aux communications: --- title: "Construction de l'estimateur de biodiversité |> Chao1" event: "Semaine des mathématiques 2020" event_url: https://eduscol.education.fr/cid59178/|> semaine-des-mathematiques.html location: Université de Guyane summary: [] abstract: | Pour estimer le nombre d’espèces (richesse spécifique) d’une communauté à partir d’un échantillon, l’estimateur Chao1 est l’outil le plus utilisé. Sa construction est expliquée et son efficacité est testée sur des données simulées. # Talk start and end times. # End time can optionally be hidden by # prefixing the line with `#`. date: "2020-03-11T11:00:00Z" date_end: "2020-03-11T12:00:00Z" all_day: false # Schedule page publish date (NOT talk date). publishDate: "2020-04-14" # Is this a featured talk? (true/false) featured: false image: caption: 'Produit scalaire des vecteurs $v_0$ |> et $v_2$' focal_point: Smart url_code: "https://github.com/EricMarcon/Chao1" url_pdf: "https://EricMarcon.github.io/Chao1/|> Chao1.pdf" url_slides: "https://EricMarcon.github.io/Chao1/|> Chao1.html" # Enable math on this page? math: true --- Les liens (url_code par exemple) font apparaître des boutons qui permettent d’afficher respectivement le code source de la présentation, un fichier pdf et les diapositives en ligne. 4.7.7.6 Autres éléments Il est possible d’ajouter librement des éléments supplémentaires sur le site: dans /contents/<langue>/, créer un dossier dont le nom est le type d’éléments (exemple: recette); ajouter des éléments dans ce dossier, chacun dans son propre dossier; le fichier obligatoire est index.md ou index.Rmd avec un en-tête contenant possiblement tous les champs rencontrés dans les éléments post, publication et talk; le fichier de vignette, featured.png ou featured.jpg, est facultatif; tous les fichiers nécessaires au tricot (images, données) peuvent être ajoutés dans le même dossier; dans /contents/<langue>/home, ajouter un composant de la page d’accueil en copiant-collant un élément existant de type “pages” (comme publications) ou “portfolio” (comme featured) et le paramétrer pour qu’il pointe sur le bon dossier (dans l’exemple: page-type=recette) et ajuster son apparence (nombre d’éléments par exemple) et sa position (poids); ajouter éventuellement une entrée de menu pour pointer sur le composant, avec le même poids que le composant. Les fichiers d’index peuvent porter l’extension .Rmd ou .md. Dans le premier cas, ils seront traités par blogdown, qui supporte l’intégration de code R. Dans l’autre cas, ils seront traités par Hugo, qui ne gère que le format markdown standard. Les fichiers .md nécessitent moins de ressource et sont donc préférés quand ils suffisent. 4.7.7.7 Finitions L’icône du site, qui apparaît dans la barre d’adresse des navigateurs web, se trouve dans assets/images. Le fichier icon.png peut être remplacé. 4.7.8 Intégration continue La construction du site web en production peut être confiée à GitHub (section 6.3.4), y compris sa mise à jour périodique si des pages du site traitent des données qui évoluent dans le temps. 4.7.9 Mises à jour Le thème Academic est régulièrement mis à jour. La version utilisée est indiquée dans le fichier go.mod. Pour utiliser la dernière version officielle, exécuter dans la console R la commande suivante: blogdown::hugo_cmd("mod get -u") Les fichiers go.mod et go.sum, qui contient les codes de hachage des fichiers du module, sont mis à jour. Chaque changement de version peut nécessiter des adaptations du contenu du site, référencées dans la documentation en ligne du thème89. Mettre Hugo à jour en même temps: blogdown::update_hugo() 4.8 Exportation de figures Quand la production de documents avec R Markdown n’est pas possible, les figures issues de R doivent être exportées sous forme de fichiers pour être intégrés dans un autre processus d’écriture. Il est préférable de créer des scripts pour créer les figures de façon reproductible et au format optimal. 4.8.1 Formats vectoriels et raster Les figures doivent en général être produites dans un format vectoriel: SVG pour la publication d’affiches ou de posters; EMF (Extended Meta-File) pour Word ou la suite Microsoft Office qui ne supporte pas d’autres formats; EPS (Encapsulated PostScript) ou PDF (Portable Document Format) pour LaTeX. Les figures raster (composées d’un ensemble de points, comme les photographies) sont rares dans R. La fonction image() utilisée pour afficher des cartes utilise par défaut des polygones plutôt que des points. La figure 4.10 montre le résultat du code suivant: x <- 10 * (1:nrow(volcano)) y <- 10 * (1:ncol(volcano)) image(x, y, volcano, col = hcl.colors(100, "terrain"), axes = FALSE) contour(x, y, volcano, levels = seq(90, 200, by = 5), add = TRUE, col = "brown") axis(1, at = seq(100, 800, by = 100)) axis(2, at = seq(100, 600, by = 100)) box() Figure 4.10: Courbes de niveau du volcan Maunga Whau, code fourni en exemple de l’aide de la fonction image(). Elle est composée d’un ensemble de rectangles colorés: il s’agit bien d’une image vectorielle. Si nécessaire, des images peuvent être produites aux formats BMP (bitmap, sans compression), JPEG (compressées avec perte de qualité), PNG (compressées sans perte de qualité, avec transparence possible) ou Tiff (compressées ou non). 4.8.2 Fonctions La fonction postscript() produit un fichier EPS. Le code R doit appeler la fonction pour créer le fichier, produire la figure, puis fermer le fichier, par exemple: # Ouverture du fichier postscript("Fig1.eps", width = 6, height = 4, horizontal = FALSE) # Création de la figure plot(cars) # Fermeture du fichier dev.off() ## pdf ## 2 La largeur et la hauteur (en pouces) d’un fichier vectoriel n’ont pas d’importance, mais leur rapport fixe l’aspect de la figure. La taille des textes est fixe: augmenter la taille de la figure revient donc à diminuer la taille relative des textes: procéder par essais successifs, en veillant à ce que les légendes restent lisibles à la taille finale de la figure. L’argument horizontal fixe l’orientation de la figure de façon assez imprévisible: procéder par essais. Les fonctions eps(), pdf(), bmp(), jpeg(), png() et tiff() fonctionnent de la même manière. Se référer à l’aide des fonctions pour le choix des options (résolution, niveau de compression, etc.). La fonction emf() est fournie par le package devEMF. Les polices de caractères ne sont pas incluses dans les fichiers EPS ou PDF. Si nécessaire, la fonction embedFonts() permet d’y remédier, à condition que GhostScript soit installé. 4.8.3 Package ragg Le package ragg90 améliore la qualité des fichiers PNG, JPEG et TIFF. Les fonctions optimisées sont agg_png(), agg_jpeg()et agg_tiff(). Leur usage est le même que celui des fonctions de grDevices. Les documents R Markdown produisent des images au format PNG pour leur version HTML. ragg améliore leur qualité: le package doit être installé et dev = \"ragg_png\" doit être ajoutée aux options de knitr. Pour ce document, les options déclarées dans index.Rmd sont les suivantes: knitr::opts_chunk$set( cache=FALSE, # Cache chunk results echo = TRUE, # Show/Hide R chunks warning=FALSE, # Show/Hide warnings # Figure alignment and size fig.align='center', out.width='80%', fig.asp=.75, # Graphic devices (ragg_png is better than standard png) dev = c("ragg_png", "pdf"), # Code chunk format tidy=TRUE, tidy.opts=list(blank=FALSE, width.cutoff=60), size="scriptsize", knitr.graphics.auto_pdf = TRUE ) options(width=60) Enfin, ragg peut être utilisé comme moteur de rendu graphique par défaut dans RStudio à partir de la version 1.4 (Menu “Tools > Global Options > General > Graphics > Backend”). 4.9 Flux de travail Un flux de travail (voir section 2.8) peut être intégré dans un document R Markdown à partir de la version 0.5 du package targets. library("targets") 4.9.1 Déclaration du flux Le flux est géré par des bouts de code de type targets. Leur entête minimal est {targets} au lieu de {r}, et ils doivent être nommés. Ces bouts de code permettent de créer le fichier _targets.R quand ils sont exécutés en mode non interactif, notamment pendant que le document est tricoté. S’ils sont lancés en mode interactif, par exemple dans R Studio, leur code est exécuté. L’option tar_interactive = FALSE dans leur entête permet de les tester sans tricoter tout le document. Un ancien flux éventuel doit être supprimé avant d’écrire le nouveau: tar_unscript() Le premier bout de code, avec l’option tar_globals=TRUE, écrit les options globales du flux. Pour créer le flux présenté en section 2.8, le code est simplement: ```{targets targets_global, tar_globals=TRUE} # Packages tar_option_set(packages = c("spatstat", "dbmss")) ``` Les fonctions utilisées par les cibles sont déclarées dans ce type de bout de code: elles sont ajoutées à un fichier dans le dossier de travail _targets_r (différent du dossier _targets qui contient les fichiers de calcul des cibles). 4.9.2 Déclaration des cibles Les cibles elles-mêmes sont déclarées dans des bouts de code dont le nom est celui de la variable de destination. ```{targets X, tar_simple=TRUE} runifpoint(NbPoints) ``` Chaque cible nécessite un bout de code construit de cette manière. La valeur de la cible est la dernière valeur retournée, à la manière d’une fonction qui n’utiliserait pas return(). Pendant le tricot, ce code simplifié (tar_simple=TRUE) est transformé automatiquement en écriture de cible: tar_target(X, { runifpoint(NbPoints) }) ## Define target X from chunk code. ## Establish _targets.R and _targets_r/targets/X.R. La lecture du document est alourdie par cette syntaxe particulière: targets n’est pas utile pour des documents dont le code, rapide à exécuter, doit être affiché dans le texte. En revanche, si le code est long à exécuter et n’est pas affiché, son intérêt est considérable pour limiter le temps de calcul. Les autres bouts de code nécessaires pour compléter le flux sont les suivants : NbPoints: tar_target(NbPoints, { 1000 }) ## Define target NbPoints from chunk code. ## Establish _targets.R and _targets_r/targets/NbPoints.R. d: tar_target(d, { sum(pairdist(X))/NbPoints/(NbPoints-1) }) ## Define target d from chunk code. ## Establish _targets.R and _targets_r/targets/d.R. map: tar_target(map, { autoplot(as.wmppp(X)) }) ## Define target map from chunk code. ## Establish _targets.R and _targets_r/targets/map.R. 4.9.3 Exécution du flux Pour lancer le calcul des cibles, un bout de code standard ({r}) doit appeler tar_make(): tar_visnetwork() tar_make() ## • start target NbPoints ## • built target NbPoints ## • start target X ## • built target X ## • start target d ## • built target d ## • start target map ## • built target map ## • end pipeline tar_visnetwork() permet de vérifier que le flux est correct avant de l’exécuter. Au moment de la production finale du document, l’option include=FALSE peut être ajoutée à l’entête de ce bout de code pour qu’il ne produise aucun affichage. 4.9.4 Utilisation des résultats Les bouts de code qui utilisent les valeurs des cibles doivent les lire avec tar_read(): tar_read(map) 4.9.5 Contrôle de source Les fichiers de targets doivent être inclus au contrôle de source. De cette façon, les calculs effectués localement ne seront pas répétés par GitHub Actions (chapitre 6) et la construction du document sera rapide. References "],["chap-package.html", "5 Package 5.1 Premier package 5.2 Organisation du package 5.3 Vignette et pkgdown 5.4 Code spécifique aux packages 5.5 Bibliographie 5.6 Données 5.7 Tests unitaires 5.8 Fichier .gitignore 5.9 Intégration continue 5.10 CRAN", " 5 Package Les packages de R permettent d’étendre les fonctionnalités du logiciel par du code fourni par la communauté des développeurs. Ils sont la clé du succès de R parce qu’ils permettent de diffuser rapidement de nouvelles méthodes issues de la recherche ou d’ajouter de nouveaux outils qui peuvent devenir des standards, comme le tidyverse. Il est utile de produire un package quand on a écrit des nouvelles fonctions qui forment un ensemble cohérent. Un package à usage personnel ou limité à une équipe de travail est simple à mettre en place et le temps gagné en utilisant facilement la version à jour de chaque fonction amortit très rapidement le temps consacré à la fabrication du package. Ce type de package a vocation à être hébergé sur GitHub. Des packages à usage plus large, qui fournissent par exemple le code correspondant à une méthode publiée, sont placés dans le dépôt CRAN, d’où ils pourront être installés par la commande standard install.packages(). CRAN effectue des vérifications poussées du code et n’accepte que les packages passant sans aucun avertissement sa batterie de tests. Ils doivent respecter la politique91 du dépôt. La documentation pour la création de packages est abondante. L’ouvrage de référence est celui de Wickham (2015), à consulter en tant que référence. L’approche utilisée ici consiste à créer un premier package très rapidement pour comprendre que la démarche est assez simple. Il sera ensuite enrichi des éléments nécessaires à un package diffusé à d’autres utilisateurs que son concepteur: une documentation complète et des tests de bon fonctionnement notamment. 5.1 Premier package Cette introduction reprend les recommandations du blog Créer un package en quelques minutes92 de ThinkR. 5.1.1 Création Les packages ont une organisation stricte dans une structure de fichiers et de répertoires figée. Il est possible de créer cette structure manuellement mais des packages spécialisés peuvent s’en charger: usethis automatise la création des dossiers; roxygen2 permet d’automatiser la documentation obligatoire des packages; devtools est la boîte à outils du développeur, permettant notamment de construire et tester les packages; Les trois sont à installer en premier lieu: install.packages(c("usethis", "roxygen2", "devtools")) Le package à créer sera un projet RStudio. Dans le menu des projets, sélectionner “New Project > New Directory > R package using devtools…”, choisir le nom du projet et son dossier parent. Le package s’appellera multiple, dans le dossier %LOCALAPPDATA%\\ProjetsR en suivant les recommandations de la section 1.2.4. Le nom du package doit respecter les contraintes des noms de projets: pas de caractères spéciaux, pas d’espaces… Il doit aussi être évocateur de l’objet du package. Si le package doit être diffusé, toute sa documentation sera rédigée en Anglais, y compris son nom. La structure minimale est crée: un fichier DESCRIPTION qui indique que le dossier contient un package et précise au minimum son nom; un fichier NAMESPACE qui déclare comment le package intervient dans la gestion des noms des objets de R (son contenu sera mis à jour par roxygen2); un dossier R qui contient le code des fonctions offertes par le package (vide à ce stade). Le package peut être testé tout de suite: dans la fenêtre Build de RStudio, cliquer sur “Install and Restart” construit le package et le charge dans R, après avoir redémarré le programme pour éviter tout conflit. Dans la fenêtre Packages, multiple est maintenant visible. Il est chargé, mais ne contient rien. 5.1.2 Première fonction 5.1.2.1 Fichiers Les fonctions sont placées dans un ou plusieurs fichier .R dans le dossier R. L’organisation de ces fichiers est libre. Pour cet exemple, un fichier du nom de chaque fonction sera créé. Des fichiers regroupant les fonctions similaires ou un seul fichier contenant tout le code sont des choix possibles. Le choix fait ici est le suivant: un fichier qui contiendra le code commun à tout le package: package.R; un fichier commun à toutes les fonctions: fonctions.R. 5.1.2.2 Création La première fonction, double(), est créée et enregistrée dans le fichier fonctions.R: double <- function(number) { return(2 * number) } A ce stade, la fonction est interne au package et n’est pas accessible depuis l’environnement de travail. Pour s’en persuader, construire le package (Install and Restart) et vérifier le bon fonctionnement de la fonction: double(2) Le résultat est un vecteur composé de deux 0 parce que la fonction appelée est un homonyme du package base (voir sa documentation en tapant ?double): base::double(2) ## [1] 0 0 Pour que la fonction de notre package soit visible, elle doit être exportée en la déclarant dans le fichier NAMESPACE. C’est le travail de roxygen2 qui gère en même temps la documentation de chaque fonction. Pour l’activer, placer le curseur dans la fonction et appeler le menu “Code > Insert Roxygen Skeleton”. Des commentaires sont ajoutés avant la fonction: #' Title #' #' @param number #' #' @return #' @export #' #' @examples double <- function(number) { return(2 * number) } Les commentaires à destination de roxygen2 commencent par #': la première ligne contient le titre de la fonction, c’est-à-dire un descriptif très court: son nom en général; la ligne suivante (séparée par un saut de ligne) peut contenir sa description (rubrique Description dans l’aide); la suivante (après un autre saut de ligne) peut contenir plus d’informations (rubrique Details dans l’aide); les arguments de la fonction sont décrits par les lignes @param; @return décrit le résultat de la fonction; @export déclare que la fonction est exportée: elle sera donc utilisable dans l’environnement de travail; des exemples peuvent être ajoutés. La documentation doit être complétée: #' double #' #' Double value of numbers. #' #' Calculate the double values of numbers. #' #' @param number a numeric vector. #' #' @return A vector of the same length as `number` containing the #' transformed values. #' @export #' #' @examples #' double(2) #' double(1:4) double <- function(number) { return(2 * number) } Ne pas hésiter à s’inspirer de l’aide de fonctions existantes pour respecter les standards de R (ici: ?log): penser que les fonctions sont normalement vectorielles: number est par défaut un vecteur, pas un scalaire; certains éléments commencent par une majuscule et se terminent par un point parce que ce sont des paragraphes dans le fichier d’aide; le titre n’a pas de point final; la description des paramètres ne commence pas par une majuscule. La prise en compte des changements dans la documentation nécessitent d’appeler la fonction roxygenize(). Dans la fenêtre Build, le menu “More > Document” permet de le faire. Ensuite, construire le package (Install and Restart) et vérifier le résultat en exécutant la fonction et en affichant son aide: double(2) `?`(double) Il est possible d’automatiser la mise à jour de la documentation à chaque construction du package par le menu “Build > Configure Build Tools…”: cliquer sur “Configure” et cocher la case “Automatically reoxygenize when running Install and Restart”. C’est un choix efficace pour un petit package mais pénalisant quand le temps de mise à jour de la documentation s’allonge avec la complexité du package. La reconstruction du package est le plus souvent utilisée pour tester des modifications du code: sa rapidité est essentielle. La documentation pour roxygen2 supporte le format Markdown93. A ce stade, le package est fonctionnel: il contient une fonction et un début de documentation. Il est temps de lancer une vérification de son code: dans la fenêtre Build, cliquer sur “Check” ou utiliser la commande devtools::check(). L’opération réoxygène le package (met à jour sa documentation), effectue un grand nombre de tests et renvoie la liste des erreurs, avertissements et notes détectées. L’objectif est toujours de n’avoir aucune alerte: elles doivent être traitées immédiatement. Par exemple, le retour suivant est un avertissement sur la non-conformité de la licence déclarée: > checking DESCRIPTION meta-information ... WARNING Non-standard license specification: `use_gpl3_license()` Standardizable: FALSE 0 errors v | 1 warning x | 0 notes v Erreur : R CMD check found WARNINGs Pour la corriger, mettre à jour, exécuter la commande de mise à jour de la licence, en commençant par votre nom: options(usethis.full_name = "Eric Marcon") usethis::use_gpl3_license() La liste des licences valides est fournie par R94. Après correction, relancer les tests jusqu’à la disparition des alertes. 5.1.3 Contrôle de source Il est temps de placer le code sous contrôle de source. Activer le contrôle de source dans les options du projet (figure 3.2). Redémarrer RStudio à la demande. Créer un dépôt sur GitHub et y pousser le dépôt local, comme expliqué dans le chapitre 3. Créer le fichier README.md: # multiple An R package to compute mutiple of numbers. Le développement du package est ponctué par de nombreux commits à chaque modification et une publication (push) à chaque étape, validée par une incrémentation du numéro de version. 5.1.4 package.R Le fichier package.R est destiné à recevoir le code R et surtout les commentaires pour roxygen2 qui concernent l’ensemble du package. Le premier bloc de commentaire produira l’aide du package (?multiple). #' multiple-package #' #' Multiples of numbers #' #' This package allows simple computation of multiples #' of numbers, including fast algorithms for integers. #' #' @name multiple #' @docType package NULL Son organisation est identique à celle des documentations de fonctions, avec deux déclarations particulières pour le nom du package et le type de documentation. Le code NULL après les commentaires indique à roxygen2 qu’il n’y a pas de code R lié. La documentation est mise à jour par la commande roxygen2::roxygenise(). Après reconstruction du package, vérifier que l’aide est est apparue: ?multiple. 5.2 Organisation du package 5.2.1 Fichier DESCRIPTION Le fichier doit être complété: Package: multiple Title: Calculate multiples of numbers Version: 0.0.0.9000 Authors@R: person(given = "Eric", family = "Marcon", role = c("aut", "cre"), email = "e.marcon@free.fr", comment = c(ORCID = "0000-0002-5249-321X")) Description: This package allows simple computation of multiples of numbers, including fast algorithms for integers. License: GPL-3 Encoding: UTF-8 LazyData: true Roxygen: list(markdown = TRUE) RoxygenNote: 7.1.1 Le nom du package est figé et ne doit pas être modifié. Son titre doit décrire en une ligne à quoi il sert. Le titre est affiché dans la fenêtre Packages à côté des noms des packages. La version doit respecter les conventions: Le premier nombre est la version majeure, 0 tant que le package n’est pas stable puis 1. La version majeure ne change que si le package n’est plus compatible avec ses versions précédentes, ce qui oblige les utilisateurs à modifier leur code. Le deuxième est la version mineure, incrémentée quand des fonctionnalités nouvelles sont ajoutées. Le troisième est la version de correction: 0 à l’origine, incrémentée à chaque correction de code sans nouvelle fonctionnalité. Le quatrième est réservé au développement, et commence à 9000. Il est incrémenté à chaque version instable et disparaît quand une nouvelle version stable (release) est produite. Exemple: une correction de bug sur la version 1.3.0 produit la version 1.3.1. Les versions de développement suivantes (instables, non destinées à l’usage en production) sont 1.3.1.9000 puis 1.3.1.9001, etc. Le numéro de version doit être mis à jour à chaque fois que le package est poussé sur GitHub. Quand le développement est stabilisé, la nouvelle version, destinée à être utilisée en production, est 1.3.2 si elle n’apporte pas de nouvelle fonctionnalité ou 1.4.0 dans le cas contraire. La description des auteurs est assez lourde mais simple à comprendre. Les identifiants Orcid des auteurs académiques peuvent être utilisés. Si le package a plusieurs auteurs, ils sont placés dans une fonction c(): c(person(...), person()) pour deux auteurs. Dans ce cas, il faut préciser le rôle de chacun : “cre” pour le créateur du package “aut” pour un auteur parmi les autres “ctb” pour un contributeur, qui peut avoir signalé un bug ou fourni un peu de code. La description du package en un paragraphe permet de donner plus d’informations. La licence précise la façon dont le package peut être utilisé et modifié. GPL-3 est une bonne valeur par défaut, mais d’autres choix sont possibles95. L’option LazyData signifie que les données d’exemples fournies avec le package peuvent être utilisées sans les appeler au préalable par la fonction data(): c’est le standard actuel. Enfin, les deux dernières lignes sont gérées par roxygen2. 5.2.2 Fichier NEWS.md Le fichier NEWS.md contient l’historique du package. Les nouvelles versions sont ajoutées en haut du fichier. Créer une première version du fichier: # multiple 0.0.0.9000 ## New features * Initial version of the package Les titres de premier niveau doivent contenir le nom du package et sa version. Les titres de niveau 2 sont libres, mais contiennent en général des rubriques comme “New features” et “Bug Fixes”. Pour ne pas multiplier les versions décrites, il est conseillé de modifier la version en cours et de compléter la documentation jusqu’au changement de version de correction (troisième nombre). Ensuite, l’entrée correspondant à cette version reste figée et une nouvelle entrée est ajoutée. 5.3 Vignette et pkgdown Une vignette est indispensable pour documenter correctement le package: usethis::use_vignette("multiple") Le fichier multiple.Rmd est créé dans le dossier vignettes. Ajouter un sous-titre dans son entête: la description courte du package: title: "multiple" subtitle: "Multiples of numbers" Le reste de l’entête permet à R de construire la vignette à partir de code R Markdown. Le corps de la vignette contient par défaut du code R pour déclarer les options de présentation des bouts de code et le chargement du package. Une introduction à l’utilisation du package doit être écrite dans ce document, en R Markdown. Le package pkgdown permet de créer un site d’accompagnement du package96, qui reprend le fichier README.md comme page d’accueil, la vignette dans une rubrique “Get Started”, l’ensemble des fichiers d’aide avec leurs exemples exécutés (section “Reference”), le fichier NEWS.md pour un historique du package (section “Changelog”) et des informations du fichier DESCRIPTION. Créer le site avec usethis usethis::use_pkgdown() Construire ensuite le site. Cette commande sera exécutée à nouveau à chaque changement de version du package: pkgdown::build_site() Le site est placé dans le dossier docs. Ouvrir le fichier index.htm avec un navigateur web pour le visualiser. Dès que le projet sera poussé sur GitHub, activer les pages du dépôt pour que le site soit visible en ligne (voir section 3.6). pkgdown place le site dans le dossier docs. Ajouter l’adresse des pages GitHub dans une nouvelle ligne du fichier DESCRIPTION: URL: https://GitHubID.github.io/multiple L’ajouter aussi dans le fichier _pkgdown.yml qui a été créé vide, ainsi que l’option suivante: url: https://GitHubID.github.io/multiple development: mode: auto pkgdown place le site dans le dossier docs/dev si le site d’une version stable (à trois nombres) du package existe dans docs et que la version en cours est une version de développement (à quatre nombres). De cette façon, les utilisateurs d’une version de production du package ont accès au site sans qu’il soit perturbé par les versions de développement. Le site peut être enrichi de plusieurs façons: En ajoutant des articles au format R Markdown dans le dossier vignettes/articles; En améliorant sa présentation (regroupement des fonctions par thèmes, ajout de badges, d’un sticker97…): se référer à la vignette de pkgdown. Pour enrichir la documentation du package, il est possible d’utiliser un fichier README.Rmd au format R Markdown, à tricoter pour créer le README.md standard de GitHub, utilisé comme page d’accueil du site pkgdown, qui peut de cette façon présenter des exemples d’utilisation du code. La démarche est détaillée dans R Packages98. La complexité ajoutée est à comparer au gain obtenu: une page d’accueil simple (sans code) avec des liens vers la vignette et les articles est plus simple à mettre en œuvre. 5.4 Code spécifique aux packages 5.4.1 Importation de fonctions Créons une nouvelle fonction dans fonctions.R qui ajoute un bruit aléatoire à la valeur double: fuzzydouble <- function(number, sd = 1) { return(2 * number + rnorm(length(number), 0, sd)) } Le bruit est tiré dans une loi normale centrée d’écart-type sd et ajouté à la valeur calculée. rnorm() est une fonction du package stats. Même si le package est systématiquement chargé par R, le package d’appartenance de la fonction doit obligatoirement être déclaré: les seules exceptions sont les fonctions du package base. Le package stats doit d’abord être déclaré dans DESCRIPTION qui contient une instruction Imports:. Tous les packages utilisés par le code de multiple seront listés, séparés par des virgules. Imports: stats Cette “importation” signifie simplement que le package stats doit être chargé, mais pas nécessairement attaché (voir section 2.2), pour que multiple fonctionne. Ensuite, la fonction rnorm() doit être trouvable dans l’environnement du package multiple. Il y a plusieurs façons de remplir cette obligation. D’abord, le commentaire suivant pourrait être fourni pour roxygen2: #' @import stats Tout l’espace de nom du package stats serait attaché et accessible au package multiple. Ce n’est pas une bonne pratique parce qu’elle multiplie les risques de conflits de noms (voir section 2.2). Notons que la notion d’importation utilisée ici est différente de celle de DESCRIPTION, bien qu’elles aient le même nom. Il est préférable d’importer uniquement la fonction rnorm() en la déclarant dans la documentation de la fonction: #' @importFrom stats rnorm Ce n’est pas une pratique idéale non plus parce que l’origine de la fonction n’apparaîtrait pas clairement dans le code du package. La bonne pratique est de ne rien importer (au sens de roxygen2) et de qualifier systématiquement les fonctions d’autres packages avec la syntaxe package::fonction(). C’est la solution retenue ici parce que la directive @importFrom importerait la fonction dans tout le package multiple, pas seulement dans la fonction fuzzydouble(), au risque de créer des effets de bord (modifier le comportement d’une autre fonction du package qui n’assumerait pas l’importation de rnorm()). Finalement, le code de la fonction est le suivant: #' fuzzydouble #' #' Double value of numbers with an error #' #' Calculate the double values of numbers #' and add a random error to the result. #' #' @param number a numeric vector. #' @param sd the standard deviation of the Gaussian error added. #' #' @return A vector of the same length as `number` #' containing the transformed values. #' @export #' #' @examples #' fuzzydouble(2) #' fuzzydouble(1:4) fuzzydouble <- function(number, sd = 1) { return(2 * number + stats::rnorm(length(number), 0, sd)) } 5.4.2 Méthodes S3 Les méthodes S3 sont présentées en section 2.1.2. 5.4.2.1 Classes Les objets appartiennent à des classes: # Classe d'un nombre class(2) ## [1] "numeric" # Classe d'une fonction class(sum) ## [1] "function" En plus des classes de base, les développeurs peuvent en créer d’autres. 5.4.2.2 Méthodes L’intérêt de créer de nouvelles classes est de leur adapter des méthodes existantes, le cas le plus courant étant plot(). Il s’agit d’une méthode générique, c’est-à-dire un modèle de fonction, sans code, à décliner selon la classe d’objet à traiter. plot ## function (x, y, ...) ## UseMethod("plot") ## <bytecode: 0x7ffd8013f748> ## <environment: namespace:base> Il existe dans R de nombreuses déclinaisons de plot qui sont des fonctions dont le nom est de la forme plot.class(). stats fournit une fonction plot.lm() pour créer une figure à partir d’un modèle linéaire. De nombreux packages créent des classes adaptées à leurs objets et proposent une méthode plot pour chaque classe. Les fonctions peuvent être listées: # Quelques fonctions plot() head(methods(plot)) ## [1] "plot,ANY-method" "plot,color-method" ## [3] "plot.AccumCurve" "plot.acf" ## [5] "plot.ACF" "plot.addvar" # Nombre total length(methods(plot)) ## [1] 150 Inversement, les méthodes disponibles pour une classe peuvent être affichées: methods(class = "lm") ## [1] add1 alias anova ## [4] as_flextable case.names coerce ## [7] confint cooks.distance deviance ## [10] dfbeta dfbetas drop1 ## [13] dummy.coef effects extractAIC ## [16] family formula fortify ## [19] hatvalues influence initialize ## [22] kappa labels logLik ## [25] model.frame model.matrix nobs ## [28] plot predict print ## [31] proj qqnorm qr ## [34] residuals response rstandard ## [37] rstudent show simulate ## [40] slotsFromS3 summary variable.names ## [43] vcov ## see '?methods' for accessing help and source code La méthode print est utilisée pour afficher tout objet (elle est implicite quand on saisit seulement le nom d’un objet): my_lm <- lm(dist ~ speed, data = cars) # Equivalent de '> my_lm' print(my_lm) ## ## Call: ## lm(formula = dist ~ speed, data = cars) ## ## Coefficients: ## (Intercept) speed ## -17.579 3.932 Le méthode summary affiche un résumé lisible de l’objet: summary(my_lm) ## ## Call: ## lm(formula = dist ~ speed, data = cars) ## ## Residuals: ## Min 1Q Median 3Q Max ## -29.069 -9.525 -2.272 9.215 43.201 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) -17.5791 6.7584 -2.601 0.0123 * ## speed 3.9324 0.4155 9.464 1.49e-12 *** ## --- ## Signif. codes: ## 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 15.38 on 48 degrees of freedom ## Multiple R-squared: 0.6511, Adjusted R-squared: 0.6438 ## F-statistic: 89.57 on 1 and 48 DF, p-value: 1.49e-12 Les autres méthodes ont été créées spécifiquement pour les besoins du package stats. 5.4.2.3 Attribution d’un objet à une classe Pour qu’un objet appartient à une classe, il suffit de le déclarer: x <- 1 class(x) <- "MyClass" class(x) ## [1] "MyClass" Une façon plus élégante de le faire est d’ajouter la nouvelle classe à l’ensemble des classes auquel l’objet appartient déjà: y <- 1 class(y) <- c("MyClass", class(y)) class(y) ## [1] "MyClass" "numeric" Il n’y a aucune vérification de cohérence entre la structure réelle de l’objet et une structure de la classe qui serait déclarée ailleurs: le développeur doit s’assurer que les méthodes trouveront bien les bonnes données dans les objets qui déclarent lui appartenir. Dans le cas contraire, des erreurs se produisent: class(y) <- "lm" tryCatch(print(y), error = function(e) print(e)) ## <simpleError: $ operator is invalid for atomic vectors> 5.4.3 En pratique 5.4.3.1 Création d’une méthode générique De nouvelles méthodes génériques peuvent être créées et déclinées selon les classes. A titre d’exemple, créons une méthode générique triple qui calculera le triple des valeurs dans le package multiple, déclinée en deux fonctions distinctes: une pour les entiers et une pour les réels. Les calculs sur les nombres entiers plus rapides que ceux sur les réels, ce qui justifie l’effort d’écrire deux versions du code. # Méthode générique triple <- function(x, ...) { UseMethod("triple") } La méthode générique ne contient pas de code au-delà de sa déclaration. Sa signature (c’est-à-dire l’ensemble de ses arguments) est importante parce que les fonctions dérivées de cette méthode devront obligatoirement avoir les mêmes arguments dans le même ordre et pourront seulement ajouter des arguments supplémentaires avant ... (qui est obligatoire). Comme la nature du premier argument dépendra de la classe de chaque objet, l’usage est de l’appeler x. La méthode est déclinée en deux fonctions: triple.integer<- function (x, ...){ return(x * 3L) } triple.numeric<- function (x, ...){ return(x * 3.0) } Dans sa version entière, x est multiplié par 3L, le suffixe L signifiant que 3 doit être compris comme un entier. Dans sa version réelle, 3 est noté 3.0 pour montrer clairement qu’il s’agit d’un réel. Sous R, 3 sans autre précision est compris comme un réel. Le choix de la fonction dépend de la classe de l’objet passé en argument. # Argument entier class(2L) ## [1] "integer" # Résultat entier par la fonction triple.integer class(triple(2L)) ## [1] "integer" # Argument réel class(2) ## [1] "numeric" # Résultat réel par la fonction triple.numeric class(triple(2)) ## [1] "numeric" # Performance microbenchmark::microbenchmark(triple.integer(2L), triple.numeric(2), triple(2L)) ## Unit: nanoseconds ## expr min lq mean median uq ## triple.integer(2L) 316 326.0 21957.52 336.0 370.5 ## triple.numeric(2) 314 328.5 18749.92 337.5 386.0 ## triple(2L) 1279 1309.5 1409.66 1334.0 1392.0 ## max neval ## 2160145 100 ## 1838588 100 ## 5510 100 La mesure des performances par le package microbenchmark ne montre pas de différence entre les fonctions triple.integer() et triple.numeric comme attendu parce que le temps consacré au calcul lui-même est négligeable en comparaison du temps d’appel de la fonction. La méthode générique consomme beaucoup plus de temps que les calculs très simples ici. R teste en effet l’existence de fonctions correspondant à la classe de l’objet passé en argument aux méthodes génériques. Comme un objet peut appartenir à plusieurs classes, il recherche une fonction adaptée à la première classe, puis aux classes suivantes successivement. Cette recherche prend beaucoup de temps et justifie de réserver l’usage de méthodes génériques à la lisibilité du code plutôt qu’à une recherche de performance: l’intérêt des méthodes génériques est de fournir à l’utilisateur du code une seule fonction pour un objectif donné (plot pour réaliser une figure) quelles que soient les données à traiter. 5.4.3.2 Création d’une classe Dans un package, on créera des classes si les résultats des fonctions le justifient: structure de liste et identification de la classe à un objet (“lm” est la classe des modèles linéaires). Pour toute classe créée, les méthodes print, summary et plot (si une représentation graphique est possible) doivent être écrites. Ecrivons une fonction multiple() dont le résultat sera un objet d’une nouvelle classe, “multiple”, qui sera une liste mémorisant les valeurs à multiplier, le multiplicateur et le résultat. multiple <- function(number, times = 1) { # Calculate the multiples y <- number * times # Save in a list result <- list(x = number, y = y, times = times) # Set the class class(result) <- c("multiple", class(result)) return(result) } # Classe du résultat my_multiple <- multiple(1:3, 2) class(my_multiple) ## [1] "multiple" "list" L’appel à la fonction multiple() renvoie un objet de classe “multiple”, qui est aussi de classe “list”. En absence de fonction print.multiple(), R cherche la fonction print.list() qui n’existe pas et se rabat sur la fonction print.default(): my_multiple ## $x ## [1] 1 2 3 ## ## $y ## [1] 2 4 6 ## ## $times ## [1] 2 ## ## attr(,"class") ## [1] "multiple" "list" La fonction print.multiple doit donc être écrite pour un affichage lisible, limité au résultat: print.multiple <- function(x, ...) { print.default(x$y) } # Nouvel affichage my_multiple ## [1] 2 4 6 Les détails peuvent être présentés dans la fonction summary: summary.multiple <- function(object, ...) { print.default(object$x) cat("multiplied by", object$times, "is:\\n") print.default(object$y) } # Nouvel affichage summary(my_multiple) ## [1] 1 2 3 ## multiplied by 2 is: ## [1] 2 4 6 Enfin, une fonction plot et une fonction autoplot complètent l’ensemble: plot.multiple <- function(x, y, ...) { plot.default(y=x$y, x=x$x, type = "p", main = paste("Multiplication by", x$times), ...) } autoplot.multiple <- function(object, ...) { data.frame(x = object$x, y = object$y) %>% ggplot2::ggplot() + ggplot2::geom_point(ggplot2::aes_(x = ~x, y = ~y)) + ggplot2::labs(title = paste("Multiplication by", object$times)) } plot(my_multiple) autoplot(my_multiple) Pour des raisons techniques liées à l’évaluation non conventionnelle dans le tidyverse, les fonctions aes() doivent être remplacées par aes_() dans les packages et ajouter un ~ devant les noms des variables. Dans le cas contraire, la vérification du package renvoie une note indiquant que les variables x et y, utilisées par les arguments de aes() n’ont pas été déclarées et n’existent peut-être pas dans l’environnement local (voir section 2.2). 5.4.3.3 Documentation Les méthodes génériques et les fonctions qui les déclinent doivent être documentées comme n’importe quelle autre fonction. La gestion de l’espace des noms est un peu plus complexe: Les méthodes génériques doivent être exportées: #' @export Les fonctions dérivées de méthodes génériques ne doivent pas l’être mais être déclarées comme méthode, avec le nom de la méthode générique et la classe traitée. Etrangement, roxygen2 demande qu’une directive d’exportation soit ajoutée mais ne l’applique pas (comme il se doit) dans le fichier NAMESPACE qui est utilisé par R: #' @method plot multiple #' @export Les fonctions dérivées de méthodes génériques venant d’un autre package nécessitent d’importer la méthode générique si elle n’est pas fournie par base (print est fourni par base et n’est donc pas concerné): #' @importFrom graphics plot #' @importFrom ggplot2 autoplot Dans DESCRIPTION, le package d’origine de chaque générique doit être listé dans la directive Depends:, pas dans Imports:: Depends: R (>= 2.10), ggplot2, graphics Enfin, l’importation de fonctions du tidyverse nécessite aussi quelques précautions: le packagetidyverse est réservé à l’usage interactif de R: il n’est pas question de l’importer dans DESCRIPTION parce que ses dépendances peuvent changer et aboutir à des résultats imprévisibles; Le package magrittr fournit les tuyaux, principalement %>%. Il doit être importé dans DESCRIPTION. Imports: magrittr, stats Comme il n’est pas possible de les préfixer %>% par le nom du package, il faut importer la fonction en utilisant les délimiteurs prévus pour les fonctions dont le nom contient des caractères spéciaux: #' @importFrom magrittr `%>%` Finalement, le code complet est le suivant: #' Multiplication of a numeric vector #' #' @param number a numeric vector #' @param times a number to multiply #' #' @return an object of class `multiple` #' @export #' #' @examples #' multiple(1:2,3) multiple <- function(number, times = 1) { # Calculate the multiples y <- number * times # Save in a list result <- list(x = number, y = y, times = times) # Set the class class(result) <- c("multiple", class(result)) return(result) } #' Print objects of class multiple #' #' @param x an object of class `multiple`. #' @param ... further arguments passed to the generic method. #' #' @export #' #' @examples #' print(multiple(2,3)) print.multiple <- function(x, ...) { print.default(x$y) } #' Summarize objects of class multiple #' #' @param object an object of class `multiple`. #' @param ... further arguments passed to the generic method. #' #' @export #' #' @examples #' summary(multiple(2,3)) summary.multiple <- function(object, ...) { print.default(object$x) cat("multiplied by", object$times, "is:\\n") print.default(object$y) } #' Plot objects of class multiple #' #' @param x a vector of numbers #' @param y a vector of multiplied numbers #' @param ... further arguments passed to the generic method. #' #' @importFrom graphics plot #' @export #' #' @examples #' plot(multiple(2,3)) plot.multiple <- function(x, y, ...) { plot.default(y=x$y, x=x$x, type = "p", main = paste("Multiplication by", x$times), ...) } #' autoplot #' #' ggplot of the `multiple` objects. #' #' @param object an object of class `multiple`. #' @param ... ignored. #' #' @return a `ggplot` object #' @importFrom ggplot2 autoplot #' @importFrom magrittr `%>%` #' @export #' #' @examples #' autoplot(multiple(2,3)) autoplot.multiple <- function(object, ...) { data.frame(x = object$x, y = object$y) %>% ggplot2::ggplot() + ggplot2::geom_point(ggplot2::aes_(x = ~x, y = ~y)) + ggplot2::labs(title = paste("Multiplication by", object$times)) } 5.4.4 Code C++ L’utilisation de code C++ a été vue en section 2.5. Pour intégrer ces fonctions dans un packages, il faut respecter les règles suivantes: les fichiers .cpp contenant le code sont placés dans le dossier /src du projet; le code est commenté pour roxygen2 de la même façon que les fonctions R, mais avec le marqueur de commentaire du langage C: #include <Rcpp.h> using namespace Rcpp; //' timesTwo //' //' Calculates the double of a value. //' //' @param x A numeric vector. //' @export // [[Rcpp::export]] NumericVector timesTwo(NumericVector x) { return x * 2; } dans DESCRIPTION, importer les packages. Rcpp, et RcppParallel si du code parallélisé est utilisé (supprimer ses références sinon), doivent être déclarés dans LinkingTo: Imports: Rcpp, RcppParallel LinkingTo: Rcpp, RcppParallel les commentaires pour roxygen2 doivent être ajoutés à package.R (“multiple” est le nom du package): #' @importFrom Rcpp sourceCpp #' @importFrom RcppParallel RcppParallelLibs #' @useDynLib multiple, .registration = TRUE les fichiers de travail de C++ sont exclus du contrôle de source dans .gitignore: # C binaries src/*.o src/*.so src/*.dll Ces modifications sont en partie effectuées automatiquement, pour Rcpp seulement, par usethis, mais l’insertion manuelle du code est plus rapide et fiable: ne pas utiliser cette commande. # usethis::use_rcpp() La construction du package entraînera la compilation du code: les Rtools sont donc indispensables. 5.4.5 Package bien rangé Tout package moderne doit être compatible avec le tidyverse, ce qui nécessite peu d’efforts: pour permettre l’utilisation de pipelines, l’argument principal des fonctions doit être le premier; les fonctions qui transforment des données doivent accepter un dataframe ou un tibble comme premier argument et retourner un objet du même format; les méthodes plot() doivent être doublées de méthodes autoplot() avec les mêmes arguments qui produisent le même graphique avec ggplot2. 5.5 Bibliographie La documentation d’un package fait appel à des références bibliographiques. Elles peuvent être gérées automatiquement avec Rdpack et roxygen2. Les références utilisées dans les fichiers R Markdown (vignette, site produit par pkgdown) ne sont pas concernées. 5.5.1 Préparation Les références bibliographiques doivent être placées dans un fichier bibtex REFERENCES.bib placé dans le dossier inst. Ce dossier contient des fichiers qui seront placés à la racine du dossier du package quand il sera installé. Ajouter la ligne suivante à DESCRIPTION: RdMacros: Rdpack Ajouter aussi le package Rdpack à la liste des packages importés: Imports: magrittr, stats, Rcpp, Rdpack Enfin, importer la fonction reprompt() de Rdpack en ajoutant les lignes suivantes à la documentation pour roxygen2 dans package.R: #' @importFrom Rdpack reprompt 5.5.2 Citations Les références sont citées par la commande \\insertCite{key}{package} dans la documentation destinée à roxygen2. package est le nom du package dans lequel le fichier REFERENCES.bib doit être cherché: ce sera normalement le package en cours, mais les références d’autres packages sont accessibles, à la seule condition qu’ils utilisent Rdpack. key est l’identifiant de la référence dans le fichier. Exemple99: documentation du package SpatDiv hébergé sur GitHub, fichier .R du package: #' SpatDiv #' #' Spatially Explicit Measures of Diversity #' #' This package extends the **entropart** package #' \\insertCite{Marcon2014c}{SpatDiv}. #' It provides spatially explicit measures of #' diversity such as the mixing index. La référence citée se trouve dans inst/REFERENCES.bib: @Article{Marcon2014c, author = {Marcon, Eric and Herault, Bruno}, title = {entropart, an R Package to Partition Diversity}, journal = {Journal of Statistical Software}, year = {2015}, volume = {67}, number = {8}, pages = {1--26}, } Les citations sont entre parenthèses. Pour placer le nom de l’auteur hors de la parenthèse, ajouter la déclaration ;textual: \\insertCite{Marcon2014c;textual}{SpatDiv} Pour citer plusieurs références (forcément du même package), les séparer par des virgules. A la fin de la documentation d’un objet utilisant des citations, ajouter systématiquement une liste des références: #' @references #' \\insertAllCited{} 5.6 Données Des données peuvent être intégrées à un package, notamment pour la clarté des exemples. La méthode la plus simple consiste à utiliser use_this. Créer des variables contenant les données à sauvegarder puis les sauvegarder: seq1_10 <- 1:10 seq1_100 <- 1:100 usethis::use_data(seq1_10, seq1_100) Un fichier .rda est créé dans le dossier data pour chaque variable créée. Avec l’option LazyData activée dans DESCRIPTION, les variables seront disponibles dès le chargement du package, mais ne seront effectivement chargées en mémoire qu’après leur première utilisation. Chaque variable doit être documentée dans le fichier package.R: #' seq1_10 #' #' A sequence of numbers from 1 to 10 #' #' @format A numeric vector. #' @source Values computed by the R software, #' \\url{https://www.r-project.org/} "seq1_10" Le nom de la variable est donné entre guillemets après le bloc de commentaires (à la place du code R d’une fonction). @format décrit le format des données et @source permet d’indiquer leur source. 5.7 Tests unitaires Dans l’idéal, tout le code inclus dans un package devrait être testé de multiples façons: contre les erreurs de syntaxe: les procédures de vérification de R s’en chargent assez bien; pour vérifier la conformité des résultats de calculs aux valeurs attendues; contre la survenue d’erreurs si les utilisateurs n’utilisent pas le code comme le développeur l’a prévu (arguments incorrects passés aux fonctions, données inadéquates…). Les tests unitaires sont utilisés dans les deux derniers objectifs. Ils s’appuient sur testthat à intégrer au package: usethis::use_testthat() ## ## Attaching package: 'testthat' ## The following object is masked from 'package:targets': ## ## matches ## The following object is masked from 'package:dplyr': ## ## matches ## The following object is masked from 'package:purrr': ## ## is_null ## The following objects are masked from 'package:readr': ## ## edition_get, local_edition ## The following object is masked from 'package:tidyr': ## ## matches Les tests doivent être ajoutés sous la forme de fichiers .R dont le nom commence obligatoirement par test dans le dossier tests/testthat. Chaque test (donc le contenu de chaque fichier) commence par son contexte, c’est-à-dire ce un ensemble de tests. Exemple, dans un fichier test_double.R: context("function double") Les tests sont contenus dans des fichiers qui les regroupent par thème, par exemple test_double.R. Le nom de chaque test est passé comme argument de la fonction test_that()): test_that("Double values are correct", { skip_on_cran() x <- 1:2 # 2 x 2 should be 4 expect_equal(double(x), c(2, 4)) # The result should be a number (type = 'double') expect_type(double(x), "double") # Error management expect_error(double("a")) }) ## Test passed 🎊 Toutes les fonctions commençant par expect permettent de comparer leur premier argument à un résultat: dans l’exemple ci-dessus, le résultat de double(1:2) doit être 2 4 et le type de ce vecteur doit être réel à double précision. Le dernier test vérifie qu’une chaîne de caractère passée comme argument génère une erreur, ce qui n’est pas optimal: si le package traitait l’erreur, le message retourné pourrait être testé. La commande skip_on_cran(), à utiliser systématiquement, évite de lancer les tests sur CRAN quand le package y sera déposé: CRAN dispose de ressources limitées et restreint strictement le temps de vérification des packages sur sa plateforme. Les tests devront donc être réalisés sur GitHub, grâce à l’intégration continue, voir section 5.9. Les tests peuvent être lancés par le menu “More > Test package” de la fenêtre Build ou par la commande devtools::test(). Il est conseillé d’écrire les tests dès qu’une fonction du package est stabilisée. 5.8 Fichier .gitignore Le fichier .gitignore obtenu à ce stade est incomplet. Il peut être remplacé par celui-ci: # History files .Rhistory .Rapp.history # Session Data files .RData # Example code in package build process *-Ex.R # Output files from R CMD build /*.tar.gz # Output files from R CMD check /*.Rcheck/ # RStudio files .Rproj.user/ .Rprofile # knitr and R markdown default cache directories *_cache/ /cache/ # Temporary files created by R markdown *.utf8.md *.knit.md # C binaries src/*.o src/*.so src/*.dll /src-i386/ /src-x64/ # uncomment if pkgdown is run by CI # docs/ La dernière ligne concerne le dossier docs/, qui reçoit le site web produit par pkgdown. Elle est commentée tant que la production du site est réalisée localement, mais décommentée si elle est confiée à GitHub Actions (voir section suivante). 5.9 Intégration continue La vérification (Check) du package doit être effectuée à chaque étape du développement, ce qui consomme un temps considérable. Elle peut être automatisée très simplement avec le service GitHub Actions, déclenché à chaque modification du dépôt sur GitHub. L’analyse de la couverture du code par les tests (quelles parties du codes sont testées ou non) sera ajoutée. GitHub est également capable de reconstruire la documentation du package avec pkgdown, autre opération consommatrice de ressources, après la réussite des tests. La section 6.3.5 détaille le moyen de le faire. 5.10 CRAN Les packages dont l’audience dépasse l’entourage de l’auteur peuvent être déposés sur CRAN. Les règles à respecter sur CRAN sont nombreuses100. Elles sont vérifiées par la commande de vérification R CMD check avec l’option -- as.cran. La vérification ne doit renvoyer aucune erreur, aucun avertissement, ni aucune note avant de soumettre le package. 5.10.1 Test du package La vérification du package par GitHub dans le cadre de l’intégration continue n’est pas suffisante. Le package doit être testé sur la version de développement de R. Le site R-hub builder101 permet de le faire simplement. Le package, dont la version ne doit pas être de développement (limitée à trois nombres, voir section 5.2.1), doit être construit au format source: dans la fenêtre Build de RStudio, cliquer sur “More > Build Source Package”. Sur le site R-hub builder, cliquer sur “Advanced”, sélectionner le fichier source du package et la plateforme de test: Debian Linux, R-devel, GCC. Le package rhub permet d’utiliser la même plateforme de vérification que le site R-hub builder depuis RStudio. La première étape consiste à valider son adresse de messagerie avec la commande validate_email(). Ensuite, il suffit d’appeler la fonction check_for_cran() pour lancer une vérification complète. 5.10.2 Soumission Quand le package est au point, la soumission à CRAN se fait par le site web dédié102. En cas de rejet, traiter les demandes et soumettre à nouveau en incrémentant le numéro de version. 5.10.3 Maintenance Des demandes de corrections sont envoyées par CRAN de temps à autre, notamment lors des changements de version de R. L’adresse de messagerie du responsable du package (maintainer) doit rester valide et les demandes doivent être traitées rapidement. Dans le cas contraire, le package est archivé. Les nouvelles versions du package sont soumises de la même façon que la première. References "],["chap-ci.html", "6 Intégration continue 6.1 Outils 6.2 Principes 6.3 Modèles de scripts 6.4 Ajouter des badges", " 6 Intégration continue L’intégration continue consiste à confier à un service externe la tâche de vérifier un package, produire des documents Markdown pour les pages web d’un dépôt GitHub ou tricoter entièrement un site web à partir du code. Toutes ces tâches peuvent être accomplies localement sur le poste de travail mais prennent du temps et risquent de ne pas être répétées à chaque mise à jour. Dans le cadre de l’intégration continue, elles le sont systématiquement, de façon transparente pour l’utilisateur. En cas d’échec, un message d’alerte est envoyé. La mise en place de l’intégration continue se justifie pour des projets lourds, avec des mises à jour régulières. plutôt que pour des projets contenant un simple document Markdown rarement modifié. 6.1 Outils 6.1.1 GitHub Actions L’outil utilisé le plus fréquemment pour des projets R déposés sur GitHub était Travis CI103 mais le service est devenu payant en 2021. Les Actions GitHub remplacent avantageusement Travis. Ce service est intégré à GitHub. 6.1.2 Codecov Pour évaluer le taux de couverture du code des packages R, c’est-à-dire la proportion du code testé d’une façon ou d’une autre (exemples, tests unitaires, vignette), le service Codecov104 s’intègre parfaitement à GitHub. Il faut ouvrir un compte, de préférence en s’authentifiant par GitHub. 6.1.3 GitHub Pages Les pages web de GitHub peuvent être hébergées dans le répertoire docs de la branche master du projet: c’est la solution retenue quand elle sont produites sur le poste de travail. Si elles sont produites par intégration continue, elle le seront obligatoirement dans une branche dédiée appelée gh-pages. 6.2 Principes Un projet de document est traité en exemple. L’objectif est de faire tricoter par GitHub un projet Markdown. Cette pratique est appropriée pour les projets d’ouvrages, qui nécessitent beaucoup de ressources pour leur construction. Dans ce type de projet, le code est tricoté par knitr pour produire plusieurs documents, typiquement aux formats HTML et PDF, accessibles sur les pages GitHub. Quand les documents sont produits localement, ils sont placés dans le dossier docs et poussés sur GitHub. Pour que GitHub s’en charge, quelques réglages sont nécessaires. 6.2.1 Obtention d’un jeton d’accès personnel Pour écrire sur GitHub, le service d’intégration continue devra s’authentifier au moyen d’un jeton d’accès personnel (Personal Access Token: PAT) dont la création est décrite en section 1.4.4. Générer un nouveau jeton, le décrire en tant que “GitHub Actions” et lui donner l’autorisation “repo”, c’est-à-dire modifier tous les dépôts (il n’est pas possible de limiter l’accès à un dépôt particulier). 6.2.2 Secrets du projet Sur GitHub, afficher les paramètres du projet et sélectionner “Secrets”. Le bouton “New Repository Secret” permet de stocker des variables utilisées dans les scripts des Actions GitHub (visibles publiquement) sans en diffuser la valeur. Le jeton d’accès personnel est indispensable pour que les Actions GitHub puissent écrire leur production dans le projet. Créer un secret nommé “GH_PAT” et saisir la valeur du jeton sauvegardée précédemment. Après avoir cliqué sur “Add Secret”, le jeton ne pourra plus être lu. Pour permettre l’envoi de messages de succès ou d’échec sans diffuser son adresse de messagerie, créer un secret nommé “EMAIL” qui la contient. 6.2.3 Activation du dépôt sur CodeCov L’analyse de la couverture du code des packages est utile pour détecter les portions de code non testées. En revanche, l’analyse de la couverture des projets de document n’a pas d’intérêt. Pour activer un dépôt, il faut d’authentifier sur le site de CodeCov avec son compte GitHub. La liste des dépôts est affichée et peut être actualisée. Si les dépôts à traiter sont hébergés par une organisation, par exemple les dépôts d’une salle de classe GitHub, il faut actualiser la liste des organisations en suivant les instructions (un lien permet de modifier rapidement les options de GitHub pour autoriser la lecture d’une organisation par Codecov) et à nouveau mettre à jour la liste des dépôts. Enfin, quand le dépôt recherché est visible, il faut l’activer. Il est inutile d’utiliser le système de jetons de Codecov. 6.2.4 Scripter les actions de GitHub Un flux de travail (workflow) de GitHub est une succession de tâches (jobs) comprenant des étapes (steps). Un flux de travail est déclenché par un évènement, généralement chaque push du projet, mais aussi à intervalles réguliers (cron). Typiquement, les flux créés ici contiennent deux tâches: la première installe R et les composants nécessaires et exécute des scripts R (ce qui constitue ses étapes successives); la seconde publie des fichiers obtenus dans les pages GitHub. Les flux de travail sont configurés dans un fichier au format YAML placé dans le dossier .github/workflows/ du projet. Les différentes parties du script sont présentées ci-dessous. Le script complet est celui de ce document, accessible sur GitHub105. 6.2.4.1 Déclenchement L’action est déclenchée à chaque fois que des mises à jour sont poussées sur GitHub: on: push: branches: - master La branche prise en compte est master (à remplacer par main le cas échéant). Pour déclencher l’action périodiquement, il faut utiliser la syntaxe de cron (le système de planification des tâches sous Unix): on: schedule: - cron: '0 22 * * 0' # every sunday at 22:00 Les valeurs successives sont celles des minutes, des heures, du jour (quantième du mois), du mois et du jour de la semaine (0 pour dimanche à 6 pour samedi). Les * permettent d’ignorer une valeur. Les entrées push et schedule peuvent être utilisées ensemble: on: push: branches: - master schedule: - cron: '0 22 * * 0' Actuellement, la planification n’est prise en compte que dans la branche master. 6.2.4.2 Nom du flux de travail Le nom du flux est libre. Il sera affiché par le badge qui sera ajouté dans le fichier README.md du projet (voir section 6.4). name: bookdown 6.2.4.3 Première tâche Les tâches sont décrites dans la rubrique jobs. renderbook est le nom de la première tâche: il est libre. Ici, l’action principale consistera à produire un ouvrage bookdown avec la fonction render_book(), d’où son nom. jobs: renderbook: runs-on: macOS-latest La déclaration runs-on décrit le système d’exploitation sur lequel la tâche doit s’exécuter. Les choix possibles sont Windows, Ubuntu ou MacOS106. L’intégration continue de R sur GitHub utilise habituellement MacOS qui a l’avantage d’utiliser des packages R compilés donc beaucoup plus simples (certains packages nécessitent des librairies extérieures à R pour leur compilation) et rapides à installer, tout en permettant l’usage de scripts. 6.2.4.4 Premières étapes Les étapes sont décrites dans la rubrique steps. steps: - name: Checkout repo uses: actions/checkout@v2 - name: Setup R uses: r-lib/actions/setup-r@v1 - name: Install pandoc run: | brew install pandoc Chaque étape est décrite par son nom (libre) et ce qu’elle réalise. La force de GitHub Actions est de permettre l’utilisation d’actions écrites par d’autres et stockées dans un projet public GitHub. Une action est un script accompagné de métadonnées qui décrivent son usage. Son développement est accompagné par des numéros de version successifs. On appelle une action par l’instruction uses:, le projet GitHub qui la contient et sa version. Dans leur projet GitHub respectif, les actions existent dans leur version de développement (@master) et dans des versions d’étape (release) accessibles par leur numéro (@v1). Ces versions d’étape sont préférables parce qu’elles sont stables. Les actions généralistes sont mises à disposition par GitHub dans l’organisation GitHub Actions107. L’action “actions/checkout” permet de se placer dans la branche principale du projet traité par le flux de travail: c’est en général la première étape de tous les flux. L’action suivante est l’installation de R, mise à disposition par l’organisation R infrastructure108. L’installation de pandoc (logiciel extérieur à R mais nécessaire à R Markdown) peut être réalisée par une commande exécutée par MacOS. Elle est appelée par run: et peut contenir plusieurs lignes (d’où le |). Ce script dépend du système d’exploitation: brew est le gestionnaire de paquets de MacOS. Pour éviter les spécificités d’un système, il est préférable d’utiliser une action: - name: Install pandoc uses: r-lib/actions/setup-pandoc@v1 6.2.4.5 Caches L’installation des packages de R prend du temps, beaucoup s’ils sont installés à partir des sources (la procédure standard sous Ubuntu, mais pas sous MacOS et Windows où les packages binaires sont utilisés par défaut). Le calcul des bouts de code est en général l’étape la plus longue du flux de travail. L’action cache permet de mettre en cache les résultats des deux opérations. - name: Cache Renv packages uses: actions/cache@v2 with: path: $HOME/.local/share/renv key: r-${{ hashFiles('renv.lock') }} restore-keys: r- - name: Cache bookdown results uses: actions/cache@v2 with: path: _bookdown_files key: bookdown-${{ hashFiles('**/*Rmd') }} restore-keys: bookdown- Le cache est mis à jour en cas de modification d’un package ou d’un bout de code, ce qui nécessite un moyen rapide de vérifier les modifications: une valeur de contrôle (hashtag) est calculée par la fonction hashFiles() à partir du fichier renv.lock (voir ci-dessous) pour les packages et l’ensemble des fichiers .Rmd pour les bouts de code. Tout changement entraîne la réinstallation des packages ou le recalcul de l’ensemble du code: la gestion du cache est moins fine que celle de R sur un poste de travail, qui ne recalcule que les bouts de code modifiés. 6.2.4.6 Packages L’installation des packages est gérée par la fonction install.packages(). Plutôt que d’énumérer les packages à installer dans les arguments de la fonction, source d’erreur, il est préférable d’utiliser le package renv pour enregistrer tous les packages utilisés par le projet et les installer en une fois pour l’intégration continue. renv installera les packages dans la version enregistrée, ce qui permet d’éviter des effets imprévus dus à des versions différentes entre le poste de travail et GitHub Actions. - name: Install packages run: | R -e 'install.packages("renv")' R -e 'renv::restore()' Il est nécessaire d’installer renv sur le poste de travail utilisé pour le développement du projet. Il faut utiliser un fichier DESCRIPTION pour lister les packages de tout projet, comme si c’était un package R. Pour ce document: Package: travailleR Title: Travailler avec R Version: 1.1.0 Authors@R: c( person("Eric", "Marcon", , "e.marcon@free.fr", c("aut", "cre")) ) URL: https://github.com/EricMarcon/travailleR Imports: bookdown, (...) Avant de déclencher le flux de travail, il est nécessaire de créer la liste des packages dans leur version en cours sur le poste de travail: renv::snapshot(type = "explicit") A sa première utilisation, le package renv informe de quelques adaptations de l’environnement de travail, qu’il faut accepter. Cette commande crée le fichier renv.lock qui est utilisé par GitHub Actions pour installer les packages pendant l’intégration continue. Il pourra être mis à jour à tout moment pour prendre en compte leur mise à jour. Alternativement, les packages nécessaires peuvent être installés sans l’aide de Renv: - name: Install packages run: | options(pkgType = "binary") options(install.packages.check.source = "no") install.packages(c("remotes", "bookdown", "formatR", "tinytex")) tinytex::install_tinytex() remotes::install_deps(dependencies = TRUE) shell: Rscript {0} Cette étape utilise Rscript comme environnement de commande, ce qui lui permet d’exécuter directement des commandes R (à comparer à l’utilisation de R -e dans les exemples précédents). Les packages servant à produire le document sont listés: remotes pour sa fonction install_deps(); bookdown pour tricoter; formatR pour la mise en forme des bouts de code (tidy=TRUE); tinytex pour disposer d’une distribution LaTeX. Les autres packages, ceux utilisés par le projet, sont lus dans le fichier DESCRIPTION par la fonction install_deps(). Sous MacOS, les packages sont installés par défaut en version binaire, mais à partir de leur code source s’il est plus récent. La création des packages binaires prend quelques jours à CRAN: cette situation n’est donc pas rare. Les packages ne contenant que du code R ou du code C++ sans référence à des librairies externes s’installent en revanche sans problème. En revanche, si le package nécessite des librairies externes à R ou une compilation de code Fortran, l’installation échoue. Il serait donc nécessaire d’installer préalablement les librairies nécessaires (et éventuellement un compilateur Fortran) à l’ensemble des packages dont le projet dépend: cette solution n’est pas réaliste parce qu’elle implique l’inventaire de l’ensemble des dépendances, qui peuvent changer, et un nombre important d’installations chronophages et inutiles la plupart du temps, quand les packages binaires sont à jour. Une meilleure solution est de forcer l’installation des packages binaires même si le code source est plus récent: c’est l’objet des deux options de R définies avant l’appel à install.packages(). Dans cette approche, les packages ne sont pas mis en cache. 6.2.4.7 Tricot La production de l’ouvrage est lancée par une commande R. - name: Render pdf book run: | bookdown::render_book("index.Rmd", "bookdown::pdf_book") shell: Rscript {0} - name: Render gitbook run: | bookdown::render_book("index.Rmd", "bookdown::gitbook") shell: Rscript {0} Les formats paramétrés dans _output.yml sont ignorés. Le fichier PDF doit être produit avant le format GitBook pour que son lien de téléchargement soit ajouté à la barre de menu du site GitBook. D’autre part, R doit être fermé et rouvert entre les deux rendus faute de quoi les tableaux ne sont pas créés correctement dans le GitBook109. Les deux étapes ne doivent pas être regroupées en une seule. 6.2.4.8 Sauvegarde Le résultat du tricot, placé dans le dossier docs de la machine virtuelle en charge de l’intégration continue, doit être préservé pour que la tâche suivante puisse l’utiliser. La dernière étape de la tâche de production utilise l’action upload-artifact pour cela. - name: Upload artifact uses: actions/upload-artifact@v1 with: name: _book path: docs/ Le contenu de docs est sauvegardé en tant qu’artefact nommé \"_book\". Les artefacts sont visibles publiquement sur la page des Actions du projet GitHub. Après sa dernière étape, la machine virtuelle utilisée pour cette étape est détruite. 6.2.4.9 Publication La publication de l’artefact dans la branche gh-pages du projet nécessite une autre tâche. checkout-and-deploy: runs-on: ubuntu-latest needs: renderbook steps: - name: Checkout uses: actions/checkout@v2 - name: Download artifact uses: actions/download-artifact@v1 with: # Artifact name name: _book # Destination path path: docs - name: Deploy to GitHub Pages uses: Cecilapp/GitHub-Pages-deploy@v3 env: GITHUB_TOKEN: ${{ secrets.GH_PAT }} with: email: ${{ secrets.EMAIL }} build_dir: docs jekyll: no La tâche est nommée “checkout-and-deploy” (le nom est libre). Elle s’exécute sur une machine virtuelle sous Ubuntu. Elle ne peut se lancer que si la tâche “renderbook” a réussi. Ses étapes sont les suivantes: Checkout: Placement dans la branche principale du projet; Download artifact: Restauration du dossier docs; Deploy to GitHub Pages: copie du dossier docs dans la branche gh-pages. Cette dernière étape utiliser l’action GitHub-Pages-deploy mise à disposition par l’organisation Cecilapp . Elle utilise une variable d’environnement, GITHUB_TOKEN, pour s’authentifier et des paramètres: email: l’adresse de messagerie destinataire du rapport d’exécution. Pour ne pas exposer l’adresse publiquement, elle a été stockée dans un secret du projet; buid_dir: le répertoire à publier, jekyll:no pour créer un fichier vide nommé .nojekyll qui indique aux pages GitHub de ne pas essayer de traiter leur contenu comme un site web Jekyll. 6.3 Modèles de scripts Des modèles de scripts pour tous les types de projets sont présentés ici. Tous nécessitent même préparation: les secrets GH_PAT et EMAIL doivent être enregistrés dans le projet GitHub (section 6.2.2); un fichier DESCRIPTION doit être utilisé pour lister les packages nécessaires (section 5.2.1), quel que soit le type de projet; un instantané des packages installés (renv.lock) doit être réalisé si renv (section 6.2.4.6) est utilisé. La branche gh-pages est créée automatiquement par les scripts. Vérifier après la première exécution que les pages GitHub sont bien activées sur cette branche (section 3.6). Supprimer ensuite le dossier docs s’il existait, pousser la modification sur GitHub et enfin ajouter la ligne suivante au fichier .gitignore pour pouvoir tricoter localement les projets sans perturber GitHub: docs/ 6.3.1 memoiR La fonction build_ghworkflow() du package memoiR crée automatiquement les scripts nécessaires à la production des modèles du package. Le script est toujours nommé memoir.yml. Ces scripts n’utilisent ni renv ni cache. Ils n’ont pas besoin d’un fichier DESCRIPTION pour l’installation des dépendances mais chaque document doit contenir son le bout de code de paramétrage (Options) la liste de tous les packages nécessaires à son tricot (stockés dans la variable Packages). 6.3.2 Projet d’ouvrage Le flux de travail s’appelle rmarkdown; sa tâche de production render. on: push: branches: - master name: rmarkdown jobs: render: runs-on: macOS-latest steps: - name: Checkout repo uses: actions/checkout@v2 - name: Setup R uses: r-lib/actions/setup-r@v1 - name: Install pandoc uses: r-lib/actions/setup-pandoc@v1 - name: Install dependencies run: | options(pkgType = "binary") options(install.packages.check.source = "no") install.packages(c("memoiR", "rmdformats", "tinytex")) tinytex::install_tinytex() shell: Rscript {0} - name: Render pdf book run: | bookdown::render_book("index.Rmd", "bookdown::pdf_book") shell: Rscript {0} - name: Render gitbook run: | bookdown::render_book("index.Rmd", "bookdown::gitbook") shell: Rscript {0} - name: Upload artifact uses: actions/upload-artifact@v1 with: name: ghpages path: docs checkout-and-deploy: runs-on: ubuntu-latest needs: render steps: - name: Checkout uses: actions/checkout@v2 - name: Download artifact uses: actions/download-artifact@v1 with: name: ghpages path: docs - name: Deploy to GitHub Pages uses: Cecilapp/GitHub-Pages-deploy@v3 env: GITHUB_TOKEN: ${{ secrets.GH_PAT }} with: email: ${{ secrets.EMAIL }} build_dir: docs jekyll: no 6.3.3 Articles et présentations Le flux de travail s’appelle rmarkdown; sa tâche de production render. on: push: branches: - master name: rmarkdown jobs: render: runs-on: macOS-latest steps: - name: Checkout repo uses: actions/checkout@v2 - name: Setup R uses: r-lib/actions/setup-r@v1 - name: Install pandoc uses: r-lib/actions/setup-pandoc@v1 - name: Install dependencies run: | options(pkgType = "binary") options(install.packages.check.source = "no") install.packages(c("memoiR", "rmdformats", "tinytex")) tinytex::install_tinytex() shell: Rscript {0} - name: Render Rmarkdown files run: | RMD_PATH=($(ls | grep "[.]Rmd$")) Rscript -e 'for (file in commandArgs(TRUE)) |> rmarkdown::render(file, "all")' ${RMD_PATH[*]} Rscript -e 'memoiR::build_githubpages()' - name: Upload artifact uses: actions/upload-artifact@v1 with: name: ghpages path: docs checkout-and-deploy: runs-on: ubuntu-latest needs: render steps: - name: Checkout uses: actions/checkout@v2 - name: Download artifact uses: actions/download-artifact@v1 with: name: ghpages path: docs - name: Deploy to GitHub Pages uses: Cecilapp/GitHub-Pages-deploy@v3 env: GITHUB_TOKEN: ${{ secrets.GH_PAT }} with: email: ${{ secrets.EMAIL }} build_dir: docs jekyll: yes L’étape chargée du tricot utilise un script pour lister tous les fichiers .Rmd, les traiter (tous les formats de sortie listés dans leur entête yaml sont produits). La fonction build_githubpages() (voir section 4.3.2) place les résultat dans docs. La tâche de déploiement indique aux pages GitHub d’utiliser Jekyll, c’est-à-dire d’utiliser le fichier README.md comme page d’accueil. Si l’étape de tricot nécessite de modifier la langue utilisée par R, par exemple pour afficher correctement la date de production des documents, elle peut être modifiée comme ceci: - name: Render Rmarkdown files run: | Sys.setlocale("LC_TIME", "fr_FR") lapply(list.files(pattern="*.Rmd"), function(file) rmarkdown::render(file, "all")) memoiR::build_githubpages() shell: Rscript {0} La sélection des fichiers est ici réalisée par un script R, qui inclut une commande de localisation, ici en Français. Cette étape peut être complétée par la sélection d’un thème GitHub Pages pour que la page d’accueil contienne un lien vers le code: run: | echo 'theme: jekyll-theme-slate' > docs/_config.yml Le thème est ici “Slate”, un des choix proposés par les pages GitHub. 6.3.4 Site web blogdown Le fichier appelé blogkdown.yml est très similaire, mais le contexte est différent: le code du site web est ici dans la branche source du dépôt (voir section 4.7). Le nom du flux de travail est blogdown et celui de la tâche de production est buildsite. on: push: branches: - source schedule: - cron: '0 22 * * 0' name: blogdown jobs: buildsite: runs-on: macOS-latest steps: - name: Checkout repo uses: actions/checkout@v2 with: ref: 'source' - name: Setup R uses: r-lib/actions/setup-r@v1 - name: Install pandoc uses: r-lib/actions/setup-pandoc@v1 - name: Cache Renv packages uses: actions/cache@v2 with: path: $HOME/.local/share/renv key: r-${{ hashFiles('renv.lock') }} restore-keys: r- - name: Install packages run: | install.packages("renv") renv::restore() shell: Rscript {0} - name: Build website run: | blogdown::install_hugo(force=TRUE) blogdown::build_site(local = TRUE, build_rmd = TRUE) shell: Rscript {0} - name: Upload artifact uses: actions/upload-artifact@v1 with: name: _website path: public/ checkout-and-deploy: runs-on: ubuntu-latest needs: buildsite steps: - name: Checkout uses: actions/checkout@v2 with: ref: 'source' - name: Download artifact uses: actions/download-artifact@v1 with: # Artifact name name: _website # Destination path path: public - name: Deploy to GitHub Pages uses: Cecilapp/GitHub-Pages-deploy@v3 env: GITHUB_TOKEN: ${{ secrets.GH_PAT }} with: branch: 'master' build_dir: public email: ${{ secrets.EMAIL }} jekyll: no L’action checkout se place dans la branche source avec sa variable ref. Il n’est pas possible de mettre en cache les résultats des bouts de code parce qu’ils se trouvent dans les pages .Rmd du projet, dont l’emplacement n’est pas prévisible. Le cache se limite aux packages. L’utilisation de Renv se justifie parce que le site est reconstruit régulièrement sans intervention de l’auteur: la stabilité de son environnement permet d’éviter un échec dû à une mise à jour incompatible d’un package. La tâche Build website utilise le package blogdown pour installer Hugo (le générateur de sites web) et ensuite construire le site. Enfin, la tâche de déploiement se place dans la branche source pour récupérer le dossier public produit par la tâche de production et la déploie dans la branche master au lieu de la branche gh-pages habituelle pour respecter l’organisation de GitHub. Si le site web utilise des données en ligne qui justifient de le mettre à jour périodiquement, GitHub Actions peut être lancé tous les jours, toutes les semaines ou tous les mois en plus des reconstruction déclenchées par une modification du dépôt (voir section 6.2.4.1). Ici, le site est reconstruit tous les dimanches à 22h. Exemple: la page qui affiche la bibliométrie du site web110 de l’auteur interroge Google Scholar pour afficher les citations des publications. Le site est mis à jour toutes les semaines pour que les statistiques soient à jour. 6.3.5 Packages R Un script optimal pour la vérification d’un package est le suivant: on: push: branches: - master name: R-CMD-check jobs: R-CMD-check: runs-on: macOS-latest env: GITHUB_PAT: ${{ secrets.GH_PAT }} steps: - uses: actions/checkout@v2 - uses: r-lib/actions/setup-r@v1 - name: Install pandoc uses: r-lib/actions/setup-pandoc@v1 - name: Install dependencies run: | options(pkgType = "binary") options(install.packages.check.source = "no") install.packages(c("remotes", "rcmdcheck", "covr", "pkgdown")) remotes::install_deps(dependencies = TRUE) shell: Rscript {0} - name: Check run: rcmdcheck::rcmdcheck(args = "--no-manual", error_on = "warning") shell: Rscript {0} - name: Test coverage run: covr::codecov(type="all") shell: Rscript {0} - name: Install package run: R CMD INSTALL . - name: Pkgdown run: | git config --local user.email "actions@github.com" git config --local user.name "GitHub Actions" Rscript -e 'pkgdown::deploy_to_branch(new_process = FALSE)' Le fichier est nommé check.yml. Il ne contient qu’une seule tâche, nommée R-CMD-check comme le flux. Le script n’utilise pas Renv pour gérer les packages parce que la vérification d’un package doit fonctionner avec les versions en cours sur CRAN. remotes installe les packages nécessaires à partir du fichier DESCRIPTION. L’étape Check vérifie le package. Les avertissements sont traités comme des erreurs. L’étape Test coverage utilise le package covr pour mesurer le taux de couverture et téléverse les résultats sur le site Codecov. Enfin, les deux dernières étapes installent le package puis utilisent pkgdown pour créer le site de documentation du package et le pousser dans la branche gh-pages du projet. Ce script ne contient qu’une tâche: le déploiement du site de documentation est directement exécuté par pkgdown. Son succès est affiché par un badge à afficher dans le fichier README.md (voir section 6.4) Des scripts plus complexes sont proposés par R-lib111, notamment pour exécuter les tests sur plusieurs systèmes d’exploitation et plusieurs versions de R. Ces tests poussés sont à effectuer avant de soumettre à CRAN (section 5.10) mais consomment trop de ressource pour un usage systématique. 6.4 Ajouter des badges Le succès des Actions GitHub est visible en ajoutant un badge dans le fichier README.md, juste après le titre du fichier. Sur la page du projet, choisir “Actions” puis sélectionner l’action (dans “Workflows”). Cliquer sur le bouton “…” puis sur “Create Status Badge”. Coller le code Markdown: # Nom du projet ![bookdown](https://github.com/<GitHubID>/<Depot>/workflows/<NomDuFlux>/badge.svg) Le nom du flux a été déclaré dans l’entrée name: du fichier de configuration des actions GitHub. Le taux de couverture mesuré par Codecov peut aussi être affiché par un badge: [![codecov](https://codecov.io/github/<GitHubID>/ <Depot>/branch/master/graphs/badge.svg)] (https://codecov.io/github/<GitHubID>/<Depot>) https://travis-ci.org/↩︎ https://codecov.io/↩︎ https://github.com/EricMarcon/travailleR/blob/master/.github/workflows/bookdown.yml↩︎ https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on↩︎ https://github.com/actions/↩︎ https://github.com/r-lib/↩︎ https://stackoverflow.com/questions/46080853/why-does-rendering-a-pdf-from-rmarkdown-require-closing-rstudio-between-renders/46083308#46083308↩︎ https://EricMarcon.github.io/fr/publication/↩︎ https://github.com/r-lib/actions/tree/master/examples#standard-ci-workflow↩︎ "],["chap-shiny.html", "7 Shiny 7.1 Première application 7.2 Application plus élaborée 7.3 Hébergement", " 7 Shiny Shiny permet de publier sous la forme d’un site web une application interactive utilisant du code R. Le site peut fonctionner localement, sur le poste de travail d’un utilisateur qui le lance à partir de RStudio, ou en ligne, sur un serveur dédié exécutant Shiny Server112. De façon basique, un formulaire permet de saisir les arguments d’un fonction et une fenêtre de visualisation d’afficher les résultats du calcul. L’utilisation d’une application Shiny rend très simple l’exécution du code, y compris pour des utilisateurs étrangers à R, mais limite évidemment les possibilités. 7.1 Première application Dans RStudio, créer une application avec le menu “File > New File > Shiny Web App…”, saisir le nom de l’application “MonAppShiny” et sélectionner le dossier où la placer. Le nom de l’application a servi à créer un dossier qu’il faut maintenant transformer en projet (menu des projets en haut à droite de RStudio, “New Project > Existing Directory”, sélectionner le dossier de l’application). Le fichier de l’application nommé app.R contient deux fonctions: ui() qui définit l’interface graphique et server() qui contient le code R à exécuter. L’application peut être lancée en cliquant sur “Run App” dans la fenêtre du code. Figure 7.1: Application Shiny Old Faithful Geyser Data. La correspondance entre la fenêtre affichée (figure 7.1) et le code de la fonction ui() est simple à voir: le titre de l’application est affiché par la fonction titlePanel(); le curseur qui fixe le nombre de barres de l’histogramme est créé par sliderInput(); la fonction sidebarLayout() fixe la disposition des éléments de la page, sidebarPanel pour les contrôles de saisie et mainPanel() pour l’affichage du résultat. Le résultat est affiché par la fonction plotOutput() dont l’argument est le nom d’un élément de output, la variable remplie par la fonction server(). Toute modification d’un élément de l’interface, précisément d’un élément affiché par une fonction dont le nom se termine par Input() (il en existe pour tous les types d’entrées, par exemple textInput()) de Shiny provoque l’exécution de server() et la mise à jour des éléments de output. 7.2 Application plus élaborée 7.2.1 Méthode de travail Une application est créée en choisissant: une disposition de la fenêtre (layout); les contrôles de saisie des paramètres (intput); les contrôles d’affichage des résultats (output). Le code pour traiter les entrées et produire les sorties est ensuite écrit dans server(). Le tutoriel de RStudio113 est très détaillé et doit être utilisé pour aller plus loin. 7.2.2 Exemple Cette application simple utilise le package scholar pour interroger Google Scholar et obtenir les données bibliométriques d’un auteur à partir de son identifiant. Le fichier app.R contient tout le code et est construit progressivement ici. L’application complète, avec des sorties graphiques en plus de sa version simplifiée présentée ici est disponible sur GitHub114. Le début du code consiste à préparer l’exécution de l’application en chargeant les packages nécessaires: # Prepare the application #### # Load packages library("shiny") library("tidyverse") Le code de l’application complète intègre une fonction pour installer les packages manquants, à n’exécuter que quand l’application est exécutée sur un poste de travail (sur un serveur, la gestion des packages n’est pas du ressort de l’application). L’interface utilisateur est la suivante: # UI #### ui <- fluidPage( # Application title titlePanel("Bibliometrics"), sidebarLayout( sidebarPanel( helpText("Enter the Google Scholar ID of an author."), textInput("AuthorID", "Google Scholar ID", "4iLBmbUAAAAJ"), # End of input br(), # Display author's name and h uiOutput("name"), uiOutput("h") ), # Show plots in the main panel mainPanel( plotOutput("network"), plotOutput("citations") ) ) ) La fenêtre de l’application est fluide, c’est-à-dire qu’elle se réorganise seule quand sa taille varie, et est composée d’un panneau latéral (pour la saisie et l’affichage de texte) et d’un panneau principal, pour l’affichage de graphiques. Les éléments du panneau latéral sont: un texte d’aide: helpText(); un champ de texte à saisir, textInput(), dont les arguments sont le nom, le texte affiché, et la valeur par défaut (l’identifiant d’un auteur); un saut de ligne: br(); des contrôles de sortie au format HTML: uiOutput(), dont l’argument unique est le nom. Le panneau principal contient deux contrôles de sortie graphiques, plotOutput() dont l’argument est aussi le nom. Le code à exécuter pour traiter les entrées et produire les sorties est dans la fonction server(). # Server logic #### server <- function(input, output) { # Run the get_profile function only once #### # Store the author profile AuthorProfile <- reactiveVal() # Update it when input$AuthorID is changed observeEvent(input$AuthorID, AuthorProfile(get_profile(input$AuthorID))) # Output #### output$name <- renderUI({ h2(AuthorProfile()$name) }) output$h <- renderUI({ a(href = paste0( "https://scholar.google.com/citations?user=", input$AuthorID), paste("h index:", AuthorProfile()$h_index), target = "_blank" ) }) output$citations <- renderPlot({ get_citation_history(input$AuthorID) %>% ggplot(aes(year, cites)) + geom_segment(aes(xend = year, yend = 0), size = 1, color = 'darkgrey') + geom_point(size = 3, color = 'firebrick') + labs(title = "Citations per year", caption = "Source: Google Scholar") }) output$network <- renderPlot({ ggplot() + geom_blank() }) } Les informations nécessaires aux champs de sortie $name et $h (nom de l’auteur et indice h) sont obtenus par la fonction get_profile() du package scholar. Cette fonction interroge la page web Google Scholar de l’auteur et extrait les valeurs du résultat: c’est une traitement lourd, qu’il vaut mieux n’exécuter qu’une seule fois plutôt que deux, dans les fonctions renderUI() chargées de calculer les valeurs de output$h et output$name. Le code le plus simple pour le faire serait le suivant: # Run the get_profile function only once #### Store the # author profile AuthorProfile <- get_profile(input$AuthorID) La difficulté de la programmation d’une application Shiny est que tout calcul se référant à un élément de l’interface d’entrée doit être réactif. Si ce dernier code était exécuté, le message d’erreur suivant apparaît: “Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)”. En pratique, l’exécution du code est lancée par la modification d’un contrôle d’entrée (ici: intput$AuthorID). Le code faisant référence à un de ces contrôles doit être en permanence en attente d’une modification: il doit donc placé dans des fonctions particulières comme renderPlot dans l’application Old Faithful Geyser Data ou renderUI() ici. Le code suivant s’exécuterait sans erreur: # Output #### output$name <- renderUI({ AuthorProfile <- get_profile(input$AuthorID) h2(AuthorProfile$name) }) L’appel à la valeur du contrôle input$AuthorID a bien lieu dans une fonction réactive (mais get_profile() devrait être utilisé une deuxième fois dans le calcul de output$h, ce que nous voulons éviter). La fonction h2(AuthorProfile$name) produit du code HTML, un paragraphe de titre de niveau 2 dont la valeur est passée en argument. Toutes les fonctions dont le nom commence par render dans le package shiny sont réactives, et chacune est destinée à produire un type de sortie différent, par exemple du texte (renderText()) ou du code HTML (renderUI()). Si du code est nécessaire pour calculer des variables communes à plusieurs contrôles de sortie (output$name et output$h), il doit lui-même être réactif. Deux fonctions sont très utiles: observeEvent() surveille les changements d’un contrôle d’entrée et exécute du code quand ils se produisent; reactiveVal() permet de définir une variable réactive, qui sera modifiée par le code de observeEvent() et entraînera à son tour l’exécution d’autres fonctions réactives qui utilisent sa valeur. Le code optimal crée donc une variable réactive pour y stocker le résultat de l’interrogation de Google Scholar: # Store the author profile AuthorProfile <- reactiveVal() La variable réactive est vide à ce stade. Son utilisation est ensuite celle d’une fonction: AuthorProfile(x) lui attribue la valeur x et AuthorProfile(), sans argument, renvoie sa valeur. La fonction observeEvent() est déclenchée quand input$AuthorID est modifié et exécute le code passé en deuxième argument, ici la mise à jour de AuthorProfile. # Update it when input$AuthorID is changed observeEvent(input$AuthorID, AuthorProfile(get_profile(input$AuthorID))) Enfin, les fonctions renderUI() qui fournissent les valeurs des contrôles de sortie utilisent la valeur de AuthorProfile: # Output #### output$name <- renderUI({ h2(AuthorProfile()$name) }) Remarquer les parenthèses de AuthorProfile(), variable réactive, par opposition à la syntaxe AuthorProfile$name pour une variable classique. La valeur de output$h est un lien internet, <a href=... en HTML, écrit par la fonction a() du package htmltools utilisé par renderUI(). output$h <- renderUI({ a(href = paste0("https://scholar.google.com/citations?user=", input$AuthorID), paste("h index:", AuthorProfile()$h_index), target = "_blank") }) Le lien est vers la page Google Scholar de l’auteur. La valeur affichée est son indice h. L’argument target = \"_blank\" indique que le lien doit être ouvert dans une nouvelle fenêtre du navigateur. Le graphique output$citations est créé par la fonction réactive renderPlot(). Les données fournies par la fonction get_citation_history() de scholar (qui interroge l’API de Google Scholar) sont traitées par ggplot(). Enfin, le graphique output$network est un graphique vide dans cette version simplifiée de l’application. L’application complète reprend ce code en y ajoutant le traitement des erreurs dans le cas où le code de l’auteur n’existe par sur Google Scholar et le graphique du réseau des co-auteurs. 7.3 Hébergement Une application Shiny n’est pas forcément hébergée par un serveur web: elle peut être exécutée sur les postes de travail des utilisateurs s’ils disposent de R. Pour un usage plus large, un serveur dédié est nécessaire. Shinyapps.io115 est un service de RStudio qui permet d’héberger gratuitement 5 applications Shiny avec un temps de fonctionnement maximal de 5 heures par mois. Il faut tout d’abord ouvrir un compte sur le site, de préférence avec ses identifiants GitHub. Pour permettre la gestion des applications en ligne directement depuis RStudio, il faut installer ensuite le package rsconnect et le paramétrer: rsconnect::setAccountInfo(name = "prenom.nom", token = "xxx", secret = "<SECRET>") Le code exact, avec le nom d’utilisateur et le jeton à utiliser, sont affichés sur la page d’accueil de Shinyapps.io: cliquer sur “Show Secret”, copier le code et le coller dans la console de RStudio pour l’exécuter. Un bouton “Publish” est disponible juste à droite du bouton “Run App”. Cliquer dessus et valider la publication (figure 7.2). Figure 7.2: Publication de l’application Shiny sur Shinyapps.io. L’application est maintenant accessible à l’adresse https://prenom-nom.shinyapps.io/MonAppShiny/ L’application “Bibliometrics” ne fonctionne pas sur Shinyapps.io parce que la façon dont le package Scholar interroge Google Scholar n’est pas supportée. La plupart des applications Shiny fonctionnent sans difficulté, tant qu’elles ne nécessitent pas de fonctionnalités réseau complexes. https://rstudio.com/products/shiny/download-server/↩︎ https://shiny.rstudio.com/tutorial/↩︎ https://github.com/EricMarcon/bibliometrics↩︎ https://www.shinyapps.io/↩︎ "],["chap-enseigner.html", "8 Enseigner avec R 8.1 learnr 8.2 GitHub Classrooms", " 8 Enseigner avec R R, RStudio et GitHub fournissent des outils pour enseigner. Le package learnr permet de réaliser des tutoriels interactifs. On verra aussi comment utiliser les salles de classe GitHub (GitHub Classrooms) qui permettent de diffuser à une classe (une liste d’étudiants disposant d’un compte GitHub) un modèle de dépôt (un début de projet R) que chaque étudiant devra développer et publier. Les outils de la salle de classe permettent d’évaluer le travail fourni assez simplement. 8.1 learnr learnr permet de rendre interactifs les bouts de code de n’importe quel document produit par R Markdown en HTML, en les transformant en applications Shiny. La documentation sur le site de RStudio116 est très claire et ne sera pas reprise ici: nous verrons seulement comment commencer et comment diffuser les tutoriels. 8.1.1 Premier tutoriel Utiliser comme pour tous les documents le menu “File > New File > RMarkdown…” et créer un nouveau document à partir d’un modèle “Interactive Tutorial”. L’assistant crée un dossier du nom choisi, à transformer en projet R et passer sous contrôle de source, comme pour tous les documents vus précédemment (voir section 4.3.2). Pour exécuter le tutoriel, cliquer sur le bouton “Run Document” qui se trouve à place habituelle du bouton “Tricoter”. Les tutoriels peuvent inclure des exercices, qui sont des bouts de code avec l’option exercise=TRUE. Ces exercices sont affichés sous la forme d’une fenêtre de code modifiable et exécutable par l’utilisateur. Des indices peuvent être donnés117, un bouton ajouté pour afficher la solution, une limite de temps peut être fixée118, et le code comme son résultat peuvent être comparés à une valeur attendue119. Des quizz120 peuvent être ajoutés, sous la forme de questionnaires à choix multiples ou uniques. La progression de l’utilisateur dans le tutoriel (code saisi, réponses aux questions…) est sauvegardée par learnr sur le poste de travail. Un tutoriel peut être arrêté puis repris sans perte de données. En revanche, il n’y a pas de moyen simple de récupérer ces données pour une évaluation par le formateur par exemple. 8.1.2 Diffusion Les tutoriels peuvent être diffusés en copiant les fichiers ou en indiquant aux utilisateurs de cloner les projets GitHub qui les contiennent. Ils peuvent aussi être hébergés sur Shinyapps.io (voir section 7.3). Enfin, ils peuvent être inclus dans un package121. 8.2 GitHub Classrooms GitHub Classrooms permet de diffuser à un public étudiant des dépôts GitHub à modifier et de contrôler le résultat. Les applications sont aussi bien l’apprentissage de R que la production de documents, pour un travail personnel ou un examen par exemple. 8.2.1 Inscription Pour commencer à utiliser l’outil, il faut ouvrir un compte. Sur le site de GitHub Classrooms122, cliquer sur “Sign in” et utiliser son compte GitHub pour s’authentifier. 8.2.2 Organisations L’étape suivant consiste à créer une organisation GitHub. Une organisation GitHub contient essentiellement des membres (titulaires d’un compte GitHub) et des dépôts accessibles à l’adresse https://github.com/Organisation/Depot. La façon la plus simple de travailler consiste à créer une organisation par cours mais d’autres approches sont possibles dans des structures utilisant intensivement l’outil. L’organisation crée pour l’exemple est ici “Cours-R”123. Une adresse de messagerie est nécessaire (utiliser la même que celle de son compte GitHub) et l’organisation doit être déclarée comme appartenant à son compte personnel. Si l’organisation n’est pas visible sur la page de GitHub Classrooms, cliquer sur “Grant us access”. 8.2.3 Nouvelle salle de classe Une salle de classe (classroom) est peuplée d’étudiants qui recevront des tâches (assignments) à exécuter. Cliquer sur New Classroom. Sélectionner l’organisation en charge de l’administration de la salle de classe. Saisir le nom de la salle de classe: une bonne pratique est de la préfixer par le nom du cours et d’ajouter le nom de la session, par exemple “Cours-R-2020-EdGuyane”. Ne pas ajouter de collaborateurs (ce sera possible plus tard), et saisir éventuellement la liste des étudiants (un nom par ligne, possible plus tard aussi). La classe est créée. Toutes les salles de classe sont visibles depuis la page d’accueil de GitHub Classrooms124. Cliquer sur un nom pour en ouvrir une. Le bouton “Settings” permet de changer son nom ou de la supprimer. Le bouton “TAs and Admins” permet d’ajouter des collaborateurs, c’est-à-dire d’autres utilisateurs GitHub qui pourront administrer la salle de classe. Le bouton “Students” permet d’ajouter des étudiants. La liste de nom est libre, sans format obligatoire. Cliquer sur “Create Roster” pour l’activer. Les noms doivent ensuite être liés à des comptes GitHub: ce travail peut être fait par l’administrateur ou par les étudiants eux-mêmes quand ils recevront la première tâche à effectuer. Chaque étudiant doit avoir un compte sur GitHub. 8.2.4 Préparer un modèle de dépôt Une tâche est un dépôt GitHub à modifier. Par exemple125, créer un dépôt contenant un projet R avec un fichier Markdown décrivant le travail à faire et éventuellement une partie du code nécessaire pour y parvenir, les autres fichiers du modèle R Markdown utilisé et un fichier de données. Si le modèle est par exemple Memo (section 4.3.2), le script GitHubPages.R est fourni. Ouvrir les propriétés du dépôt sur GitHub et cocher la case Template Repository pour en faire un modèle. 8.2.4.1 Assigner une tâche Ouvrir une salle de classe et cliquer sur “New Assignment”. Saisir un titre explicite pour les étudiants, une date limite optionnelle et choisir “Individual Assignment”. Par défaut, le nom de la tâche sert de préfixe pour le nom des dépôts des étudiants mais il peut être remplacé par un préfixe choisi. Quand les étudiants rendront leur travail, tous les dépôts de toutes les tâches seront stockés dans l’organisation. Le dépôt crée sur le compte de chaque étudiant peut être privé ou public, selon que l’on souhaite que les étudiants puissent voir le travail des autres ou non. Donner le droit d’administration et rendre le site public si les étudiants doivent pouvoir activer les pages GitHub pour présenter le résultat de leur travail. Cliquer sur “Continue”. Sélectionner le dépôt modèle (starter code) puis cliquer sur “Continue” puis “Create Assignment”. La nouvelle tâche est créée. Elle est associée à un lien d’invitation qu’il faut copier et envoyer aux étudiants. Quand ils cliqueront sur le lien, ils atteindront une page GitHub qui leur permettra d’associer leur compte à un nom de la liste (aucun contrôle n’est possible: le premier connecté peut s’associer à n’importe quel nom). Ils pourront ensuite créer un nouveau projet RStudio à partir du dépôt GitHub créé automatiquement par GitHub Classrooms, modifier ce projet selon les consignes de travail et le pousser sur GitHub. Le dépôt se trouve sur le compte de l’organisation à laquelle la classe est reliée, et est suffixé par l’identifiant GitHub de l’étudiant. 8.2.4.2 Contrôler le travail des étudiants Il est possible d’afficher chaque dépôt crée par les étudiants à partir de la page de la tâche sur GitHub Classrooms. Si le travail à produire est un document rédigé, demander aux étudiants de le placer dans les pages GitHub du dépôt pour le lire directement en ligne. L’assistant GitHub Classrooms126 permet de télécharger en une fois tous les dépôts des étudiants pour les corriger sur son poste de travail. https://rstudio.github.io/learnr/↩︎ https://rstudio.github.io/learnr/exercises.html#Hints_and_Solutions↩︎ https://rstudio.github.io/learnr/exercises.html#Time_Limits↩︎ https://rstudio.github.io/learnr/exercises.html#Exercise_Checking↩︎ https://rstudio.github.io/learnr/questions.html↩︎ https://rstudio.github.io/learnr/publishing.html#R_Package↩︎ https://classroom.github.com/↩︎ https://github.com/Cours-R↩︎ https://classroom.github.com/classrooms↩︎ https://github.com/EricMarcon/Cours-R-Memo/settings↩︎ https://classroom.github.com/assistant↩︎ "],["chap-conclusion.html", "9 Conclusion", " 9 Conclusion L’environnement de travail de R et RStudio permet de produire tous types de documents avec un langage unique. L’objectif de reproductibilité des résultats est atteint en intégrant les traitements statistiques et la rédaction. Le travail collaboratif est permis par l’utilisation systématique du contrôle de source et de GitHub. La présentation des résultats est assurée par les pages GitHub et des modèles de documents couvrant la majorité des besoins. Pour les pauses, R fournit même quelques jeux dans le package fun, dont le célèbre démineur: # Installation du package install.packages("fun") # Ouverture d'une fenêtre X et exécution if (interactive()) { if (.Platform$OS.type == "windows") x11() else x11(type = "Xlib") fun::mine_sweeper() } Ce document n’a pas pour objectif d’être exhaustif sur les possibilités de R mais plutôt de présenter une méthode de travail et des moyens simples de l’appliquer rapidement. On se reportera aux ouvrages plus détaillés cités dans le texte pour approfondir tel ou tel point. Ce document est mis à jour régulièrement en fonction de l’évolution des outils disponibles. "],["references.html", "References", " References "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] diff --git a/travailleR.pdf b/travailleR.pdf index 8bce7f987dea2417514f172853e6a287f973751e..25af5bec40876283d6d1558fb6b342595da450ad 100644 GIT binary patch delta 151735 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%0D}_7u@a|+h;Sf@B3rX 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%0A=*9zR%YhlnNZXk((XLIj~O~9KQa++AXOU!+- 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

#Jl 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 UpiG6qE6B@-PERkbB7^?F0GkZl5dZ)H diff --git a/travailleR.tex b/travailleR.tex index 203f60f..9846aef 100644 --- a/travailleR.tex +++ b/travailleR.tex @@ -323,7 +323,7 @@ \author{Eric Marcon} -\date{28/11/2021} +\date{13/12/2021} % Include headers (preamble.tex) here @@ -1234,7 +1234,7 @@ \subsection{S3}\label{sec:S3}} \begin{verbatim} ## function (x, ...) ## UseMethod("print") -## +## ## \end{verbatim} @@ -1714,7 +1714,7 @@ \subsection{Organisation}\label{organisation}} \end{Shaded} \begin{verbatim} -## +## \end{verbatim} \begin{Shaded} @@ -1786,7 +1786,7 @@ \subsection{Recherche}\label{recherche}} \begin{verbatim} ## function (save = "default", status = 0, runLast = TRUE) ## .Internal(quit(save, status, runLast)) -## +## ## \end{verbatim} @@ -1974,7 +1974,7 @@ \subsection{system.time}\label{system.time}} \begin{verbatim} ## user system elapsed -## 0.020 0.001 0.023 +## 0.021 0.001 0.023 \end{verbatim} \normalsize @@ -2005,16 +2005,16 @@ \subsection{microbenchmark}\label{microbenchmark}} \begin{verbatim} ## Unit: microseconds -## expr min lq mean median uq -## f1(X) 37.560 39.4735 56.81346 40.8800 45.4745 -## f2(X) 45.188 47.1640 66.90455 48.4005 51.9940 -## f3(X) 277.627 279.9785 322.16932 283.8930 292.2080 -## f4(X) 407.147 410.2940 460.26005 417.9145 430.6465 -## max neval -## 1388.380 100 -## 1568.827 100 -## 1935.704 100 -## 1957.666 100 +## expr min lq mean median uq max +## f1(X) 36.125 38.1700 58.72946 39.626 42.2860 1711.548 +## f2(X) 44.522 46.1740 65.76523 47.277 51.3630 1329.993 +## f3(X) 269.947 277.5345 317.09334 283.831 312.9085 1794.161 +## f4(X) 397.155 408.7510 451.15041 413.430 448.8270 1830.191 +## neval +## 100 +## 100 +## 100 +## 100 \end{verbatim} \normalsize @@ -2036,11 +2036,11 @@ \subsection{microbenchmark}\label{microbenchmark}} \end{Shaded} \begin{verbatim} -## expr median -## 1 f1(X) 40.8800 -## 2 f2(X) 48.4005 -## 3 f3(X) 283.8930 -## 4 f4(X) 417.9145 +## expr median +## 1 f1(X) 39.626 +## 2 f2(X) 47.277 +## 3 f3(X) 283.831 +## 4 f4(X) 413.430 \end{verbatim} \normalsize @@ -2069,11 +2069,11 @@ \subsection{microbenchmark}\label{microbenchmark}} \end{Shaded} \begin{verbatim} -## expr median -## 1 f1(X) 40.8800 -## 2 f2(X) 48.4005 -## 3 f3(X) 283.8930 -## 4 f4(X) 417.9145 +## expr median +## 1 f1(X) 39.626 +## 2 f2(X) 47.277 +## 3 f3(X) 283.831 +## 4 f4(X) 413.430 \end{verbatim} \normalsize @@ -2200,7 +2200,7 @@ \subsection{Fonctions vectorielles}\label{fonctions-vectorielles}} ## return(Log) ## } ## } -## +## ## \end{verbatim} @@ -2253,10 +2253,10 @@ \subsection{lapply}\label{lapply}} \begin{verbatim} ## expr median -## 1 sqrt(x1) 4.7375 -## 2 lapply(x1, FUN = sqrt) 313.4175 -## 3 sapply(x1, FUN = sqrt) 376.5980 -## 4 vapply(x1, FUN = sqrt, FUN.VALUE = 0) 313.9650 +## 1 sqrt(x1) 4.5685 +## 2 lapply(x1, FUN = sqrt) 300.2930 +## 3 sapply(x1, FUN = sqrt) 349.6645 +## 4 vapply(x1, FUN = sqrt, FUN.VALUE = 0) 304.2555 \end{verbatim} \normalsize @@ -2309,8 +2309,8 @@ \subsection{Boucles for}\label{boucles-for}} \begin{verbatim} ## expr median -## 1 Boucle(x1) 959.394 -## 2 Boucle2(x1) 82.885 +## 1 Boucle(x1) 788.678 +## 2 Boucle2(x1) 77.781 \end{verbatim} \begin{Shaded} @@ -2325,7 +2325,7 @@ \subsection{Boucles for}\label{boucles-for}} \end{verbatim} \normalsize -Le gain est considérable: de 1 à \texttt{12}. +Le gain est considérable: de 1 à \texttt{10}. Les boucles for sont maintenant nettement plus rapides que \texttt{vapply}. @@ -2341,8 +2341,8 @@ \subsection{Boucles for}\label{boucles-for}} \begin{verbatim} ## expr median -## 1 vapply(x1, FUN = sqrt, 0) 305.3245 -## 2 Boucle(x1) 76.4020 +## 1 vapply(x1, FUN = sqrt, 0) 303.9940 +## 2 Boucle(x1) 76.4565 \end{verbatim} \normalsize @@ -2364,9 +2364,12 @@ \subsection{Boucles for}\label{boucles-for}} \end{Shaded} \begin{verbatim} -## expr median -## 1 vapply(x1, FUN = sqrt, 0) 310.387 -## 2 for (i in 1:length(x1)) Racine[i] <- sqrt(x1[i]) 3260.521 +## expr +## 1 vapply(x1, FUN = sqrt, 0) +## 2 for (i in 1:length(x1)) Racine[i] <- sqrt(x1[i]) +## median +## 1 328.8625 +## 2 4046.2570 \end{verbatim} \normalsize @@ -2432,9 +2435,9 @@ \subsection{replicate}\label{replicate}} \end{Shaded} \begin{verbatim} -## expr median -## 1 replicate(1000, runif(1)) 3868.4530 -## 2 runif(1000) 33.9185 +## expr median +## 1 replicate(1000, runif(1)) 4145.402 +## 2 runif(1000) 34.735 \end{verbatim} \normalsize @@ -2472,9 +2475,9 @@ \subsection{Statistiques marginales}\label{statistiques-marginales}} \begin{verbatim} ## expr median -## 1 BoucleSomme(diamonds[-(2:4)]) 3.679657 -## 2 apply(diamonds[-(2:4)], 2, sum) 9.372713 -## 3 colSums(diamonds[-(2:4)]) 2.479086 +## 1 BoucleSomme(diamonds[-(2:4)]) 3.573513 +## 2 apply(diamonds[-(2:4)], 2, sum) 9.202811 +## 3 colSums(diamonds[-(2:4)]) 2.413988 \end{verbatim} \normalsize @@ -2682,7 +2685,7 @@ \subsection{mclapply (fork)}\label{mclapply-fork}} \begin{verbatim} ## user system elapsed -## 0.002 0.000 0.503 +## 0.002 0.000 0.524 \end{verbatim} \begin{Shaded} @@ -2694,12 +2697,12 @@ \subsection{mclapply (fork)}\label{mclapply-fork}} \begin{verbatim} ## user system elapsed -## 0.005 0.008 0.390 +## 0.004 0.010 0.298 \end{verbatim} \normalsize -La mise en place de la parallélisation a un coût d'environ \texttt{0.14} secondes ici. +La mise en place de la parallélisation a un coût d'environ \texttt{0.048} secondes ici. Le temps d'exécution est bien plus long en parallèle sous Windows parce que la mise en place du cluster prend bien plus de temps que la parallélisation n'en fait gagner. La parallélisation est intéressante pour des tâches plus longues, comme une pause d'un seconde. @@ -2714,7 +2717,7 @@ \subsection{mclapply (fork)}\label{mclapply-fork}} \begin{verbatim} ## user system elapsed -## 0.000 0.000 2.138 +## 0.000 0.000 2.079 \end{verbatim} \begin{Shaded} @@ -2726,7 +2729,7 @@ \subsection{mclapply (fork)}\label{mclapply-fork}} \begin{verbatim} ## user system elapsed -## 0.004 0.009 1.015 +## 0.001 0.003 1.009 \end{verbatim} \normalsize @@ -2745,7 +2748,7 @@ \subsection{mclapply (fork)}\label{mclapply-fork}} \begin{verbatim} ## user system elapsed -## 0.001 0.003 1.112 +## 0.001 0.003 1.148 \end{verbatim} \begin{Shaded} @@ -2756,7 +2759,7 @@ \subsection{mclapply (fork)}\label{mclapply-fork}} \begin{verbatim} ## user system elapsed -## 0.003 0.005 2.053 +## 0.004 0.005 2.181 \end{verbatim} \normalsize @@ -2948,7 +2951,7 @@ \subsubsection{Parallélisation}\label{paralluxe9lisation}} \begin{verbatim} ## user system elapsed -## 0.003 0.000 0.614 +## 0.004 0.000 0.743 \end{verbatim} \begin{Shaded} @@ -2963,7 +2966,7 @@ \subsubsection{Parallélisation}\label{paralluxe9lisation}} \begin{verbatim} ## user system elapsed -## 0.007 0.012 0.391 +## 0.008 0.014 0.392 \end{verbatim} \normalsize @@ -3049,7 +3052,7 @@ \subsection{apply}\label{apply}} \begin{verbatim} ## user system elapsed -## 5.987 0.061 6.590 +## 5.959 0.046 6.116 \end{verbatim} \begin{Shaded} @@ -3083,7 +3086,7 @@ \subsection{apply}\label{apply}} \begin{verbatim} ## user system elapsed -## 6.051 0.074 7.273 +## 5.612 0.026 5.669 \end{verbatim} \begin{Shaded} @@ -3125,7 +3128,7 @@ \subsection{apply}\label{apply}} \begin{verbatim} ## user system elapsed -## 5.599 0.056 6.448 +## 5.630 0.039 5.761 \end{verbatim} \begin{Shaded} @@ -3164,7 +3167,7 @@ \subsection{apply}\label{apply}} \begin{verbatim} ## user system elapsed -## 3.147 0.022 3.259 +## 3.194 0.015 3.218 \end{verbatim} \begin{Shaded} @@ -3205,7 +3208,7 @@ \subsection{apply}\label{apply}} \begin{verbatim} ## user system elapsed -## 3.854 0.655 2.495 +## 4.154 0.691 2.577 \end{verbatim} \begin{Shaded} @@ -3246,7 +3249,7 @@ \subsection{boucle for}\label{boucle-for}} \begin{verbatim} ## user system elapsed -## 2.082 0.021 2.369 +## 2.101 0.015 2.141 \end{verbatim} \begin{Shaded} @@ -3292,7 +3295,7 @@ \subsection{boucle foreach}\label{boucle-foreach}} \begin{verbatim} ## user system elapsed -## 2.683 0.024 2.808 +## 2.699 0.020 2.729 \end{verbatim} \begin{Shaded} @@ -3337,7 +3340,7 @@ \subsection{boucle foreach}\label{boucle-foreach}} \begin{verbatim} ## user system elapsed -## 0.126 0.047 0.112 +## 0.131 0.050 0.108 \end{verbatim} \begin{Shaded} @@ -3514,8 +3517,8 @@ \subsection{RcppParallel}\label{rcppparallel}} ## Unit: microseconds ## expr ## d <- TotalDistance(X$x, X$y)/NbPoints/(NbPoints - 1) * 2 -## min lq mean median uq max neval -## 789.221 930.0485 2077.189 2110.001 2231.706 23721.99 100 +## min lq mean median uq max neval +## 784.794 901.387 963.9472 939.291 964.2145 2622.305 100 \end{verbatim} \begin{Shaded} @@ -3555,13 +3558,13 @@ \subsection{RcppParallel}\label{rcppparallel}} \begin{verbatim} ## user system elapsed -## 7.389 0.046 7.792 +## 7.497 0.033 7.556 \end{verbatim} \normalsize En parallèle, le temps augmente peu: la parallélisation devient réellement efficace. -Ce temps est à comparer à celui de la boucle for de référence, multiplié par 2500, soit \texttt{5922} secondes. +Ce temps est à comparer à celui de la boucle for de référence, multiplié par 2500, soit \texttt{5352} secondes. \scriptsize @@ -3574,7 +3577,7 @@ \subsection{RcppParallel}\label{rcppparallel}} \begin{verbatim} ## user system elapsed -## 5.004 0.037 2.515 +## 5.160 0.035 1.965 \end{verbatim} \normalsize @@ -7154,7 +7157,7 @@ \section{Vignette et pkgdown}\label{vignette-et-pkgdown}} Le reste de l'entête permet à R de construire la vignette à partir de code R Markdown. Le corps de la vignette contient par défaut du code R pour déclarer les options de présentation des bouts de code et le chargement du package. -Une introduction à l'utilisation du package doit être écrite dans ce documents, en R Markdown. +Une introduction à l'utilisation du package doit être écrite dans ce document, en R Markdown. Le package \textbf{pkgdown} permet de créer un site d'accompagnement du package\footnote{Exemple: \url{https://EricMarcon.github.io/entropart/}}, qui reprend le fichier \texttt{README.md} comme page d'accueil, la vignette dans une rubrique \enquote{Get Started}, l'ensemble des fichiers d'aide avec leurs exemples exécutés (section \enquote{Reference}), le fichier \texttt{NEWS.md} pour un historique du package (section \enquote{Changelog}) et des informations du fichier \texttt{DESCRIPTION}. @@ -7375,7 +7378,7 @@ \subsubsection{Méthodes}\label{muxe9thodes}} \begin{verbatim} ## function (x, y, ...) ## UseMethod("plot") -## +## ## \end{verbatim} @@ -7665,14 +7668,14 @@ \subsubsection{Création d'une méthode générique}\label{cruxe9ation-dune-muxe \begin{verbatim} ## Unit: nanoseconds -## expr min lq mean median uq max -## triple.integer(2L) 324 338 25392.25 361.5 388 2502236 -## triple.numeric(2) 321 338 29363.74 363.0 402 2897269 -## triple(2L) 1318 1356 1847.92 1388.0 1447 32765 -## neval -## 100 -## 100 -## 100 +## expr min lq mean median uq +## triple.integer(2L) 325 338.0 26066.59 348.5 388.0 +## triple.numeric(2) 327 338.5 20520.94 354.0 395.0 +## triple(2L) 1327 1361.5 1723.78 1406.0 1502.5 +## max neval +## 2569299 100 +## 2006319 100 +## 18315 100 \end{verbatim} \normalsize @@ -8443,6 +8446,10 @@ \subsection{Test du package}\label{test-du-package}} Le package, dont la version ne doit pas être de développement (limitée à trois nombres, voir section \ref{sec:package-description}), doit être construit au format source: dans la fenêtre \emph{Build} de RStudio, cliquer sur \enquote{More \textgreater{} Build Source Package}. Sur le site \emph{R-hub builder}, cliquer sur \enquote{Advanced}, sélectionner le fichier source du package et la plateforme de test: \emph{Debian Linux, R-devel, GCC}. +Le package \textbf{rhub} permet d'utiliser la même plateforme de vérification que le site \emph{R-hub builder} depuis RStudio. +La première étape consiste à valider son adresse de messagerie avec la commande \texttt{validate\_email()}. +Ensuite, il suffit d'appeler la fonction \texttt{check\_for\_cran()} pour lancer une vérification complète. + \hypertarget{soumission}{% \subsection{Soumission}\label{soumission}} @@ -9033,6 +9040,28 @@ \subsection{Articles et présentations}\label{articles-et-pruxe9sentations}} La tâche de déploiement indique aux pages GitHub d'utiliser Jekyll, c'est-à-dire d'utiliser le fichier \texttt{README.md} comme page d'accueil. +Si l'étape de tricot nécessite de modifier la langue utilisée par R, par exemple pour afficher correctement la date de production des documents, elle peut être modifiée comme ceci: + +\begin{verbatim} + - name: Render Rmarkdown files + run: | + Sys.setlocale("LC_TIME", "fr_FR") + lapply(list.files(pattern="*.Rmd"), function(file) rmarkdown::render(file, "all")) + memoiR::build_githubpages() + shell: Rscript {0} +\end{verbatim} + +La sélection des fichiers est ici réalisée par un script R, qui inclut une commande de localisation, ici en Français. + +Cette étape peut être complétée par la sélection d'un thème GitHub Pages pour que la page d'accueil contienne un lien vers le code: + +\begin{verbatim} + run: | + echo 'theme: jekyll-theme-slate' > docs/_config.yml +\end{verbatim} + +Le thème est ici \enquote{Slate}, un des choix proposés par les pages GitHub. + \hypertarget{sec:blogdown-ci}{% \subsection{Site web blogdown}\label{sec:blogdown-ci}} diff --git a/travailleR_files/figure-html/r-parallele-1.png b/travailleR_files/figure-html/r-parallele-1.png index 4c20fbcd2bdb902d6e577919e8bcf97c6dfdd173..b1238fb75cf8f4d900f3b584b683b836574ad279 100644 GIT binary patch literal 44107 zcmb?@cT|&E*KYs;6@_s?kfF_J0704{RUjxTgequ6I!cq?dkN?$qbSG|dPfkXBUNfp zL<}uRuK}cYq}Omy2+aF_f8Fn{b+eX}@#Hz}clO?A@BQ14FYjt7ojv`>X&4N47O8wo z8wR6RfWfGiPtt&vW%f>2@I~`jRp}P^2A^%kN;LR7<*2Od0)ue`k^WGGPW&>5!Ty9H zZ{4`>89zVd6>sR~C%KG|x!(8i%O7ikrY3&ly^C70p?jZsr6Pme z+FN+}Twdi4c7MU)pxBkCe;`M8g z->K`v<=d^-m#VO&9_N(Uo$ea;bg4@Yt<|;bK5@9d_-RZch{L@%9$r3`=<|T!+M$jR zN_e?ZO03%S8QvvqMhYAIYtG0Pm(_t0YdJgyogP4gzN;+<<<1k0yDFCNsyY0(MnfG+ z^m5r8s(#VFFKQ!Lw8l%1E!Qz5#lbfTK1&J1dy|sr`!XHO&UNkYRS#@jY-mA>N=bd%`kPV16FH++T&5~i zK0eY{WI6olas4aHM9-fuhc71tZMaWF=n(H^cX>NO0{W%%-!Yo<+m-Ldeh}pMXEcrb zIy%Hw>xKP)eI(&P!rgDP&oYUN2iMlt7G<;oMag1a(@#m54pq2a;cBH|N`Ah+wsyvU zjBWU#p-jUq@6J@tlG2O}UZkkoY-fu7?(WrJ8-p(RlDfJ&uklM<<=v~#KiU?xNGQ4) z^1hrpGbU>K?R834*3a@U4>!O>;&WK6RL~>YjeeW_5@g|kedV^-*Jz98=&Qy41e^S7 zS<4F@5(Bnk;by%q&p)y|)>7DXZ;Bu*7TGNbRbC9c7vxM4CrIa!EXJom0lowB-ovO# z4Hc1;Or-B=z0-F|-^n(|4|M6vz+kqo7Br&U`M@V{zMToVsvv@BCH%r!g_mF=Bkqd!{?QNX6pYz`mnx)JmVJ zeJ~y;M4GCt1Uw8r3O(8ZhpJ|%N*Wrg z521pI2$7nGL-dvem`|Ae?tDu2f4PMJ>n6x+{IMHs+ ztl6&p{e3(?$BT{9mMccTGVWow>fyMdq@7MSFe3V{)b9&RwH0|8yIx-(W@Ytf=FP3I zQVeaxmmd&!eT=uhuuT36Meh+*qlAWXOfM_Y#mf8bxRZ1Y1I_EmG@W4Euj&`ZA>Ti3 zyXuWe%gSQua+7-~bH>j8+iN>CVyR-T2qT+na6#s4b5@piPf3!}>-XZ;1j*J%7Y24* zqFLaqm*byH=-{J2?k`Oldh8d$H3csOwTcvFW%2uSUVTxKr<7DTpCIJZy0)?L04eIT zF+Zeg`ADoeMrA<#7aQrkWZ*v;G|9!NnO@j;$}*R56G7=0PK1&5LEm(cfk z-4Z%&G^HoJNI&oF?&j-%d|c0>I+eVi`|#sWr_|O*c|yP-^b8N9pPY$~LV<#9R(n*Ry9n zJVfc|YfW5Zrx<0)93`Ird!;6$NZ_Ib@GY9Pn4pZ={d}G3To`-pNjxH7T zYB5PGIn0;a6qj=6WRUIFCEZMidh?8y%XjI68|veq3X;;2xE#3j?1$7slh04TIQ2)V zj*!evauIvjcnMM))ivTZl@OJcby~^Vm~3#S*{hL4#@P9q-9;Ue;i4WZMjUM=pnUTX&&_*libNo^bSgAfAWw z?sLSAKX36hhC1jhW-gOweBvMm8Hie=m7rm!#&##N{!^(hg>B8!EGQuJ-oS@0%1>~T4!$3+ffTw>g8d7Z@VwCV8X1b>Bo|B$c6MPHvzPQ# zS0?n31it}l_ zJwtzl5rfYp10DVzl*1qX-sT7mIfH1kN{bqPoEvqK>sj)s;hXbty4YI zmKa(P*8oJtnhZm4MIto*)q=D6`WdA5S}`0(+!7B%9y zN;-=erlUr;`LJ=h)Qv+d&D+V+THEdP2wI5SUPa~!M*rIw>7fR(NUrW9HLgUPYtIOB zz+e*fuZ!>mtlRDa68fyjFeHd$0QW5H!hpn7yoGH-sO$#B*mDSrwCw12x-E=JRe(J=NtoLSHSX4vOz= ze#Tn<>xW~x6y^wM9*rxw3D$B7ZOB&y7ur~VgX|zMPNl(vBvx~g1Va%zuuE|KwYU1@ zE-mes6EcyD!r{;FILyFc1$-|yh7S@evNqHp@9vzgL$5%o`he)c(CG%5nM@@l)G2IM z{E2I}Al`)Psf*gc;Q%{XIr5aN$8G-;+^R$m+j4zaSLSzEZSm$exEZ0glJZp7 z^S2`)Yp9?q^UfL(oI;9#?1`hsME*-rHJWxCq1@#u2JD=#$UsWqRiQmyv3#|a^ryPL zu%l-yI3NQlYlIl?)lJ>rlgEvl@V?xbgG)F>MDUkyWX(0{XjXUD7Gtm&|E5$o@w4D6 z`OGe0A3#m33ix`$+W74hfgiRoy@s;uNa)x8jOsJ-`W52Das%1fKrBseSZ zI+S>~AN^1O)~jGY+eqB9akC~0u3KsH*&k^y6nC;$t&&&Tqmx(x-(+e0A_W}E>C18; zk||C!K9E6b=Nc_cU4XTn%c@-b!;fC@C$2Q>X00O74v_OYB z!_@f2;z;Whvqha}c8e_zhLJT!LiBNpN9VIpk4)@p_OKY&_LO-|hMd?-ePJU`H{7Px9q;)wf3Ct` zh2)?{NYA9ThXJp<*qHIU)D21Q8KAdPFuBQSQ+J~xixxqo5OSp$KET^onl~qnB#28%dHNU|52wUAH&4ksN0KCw2d6vn zu0Y&Xoub0?*H0_ZH81be&sTx8==m8<^v+I{2*W~ghlWjqOI1Z43l9>cL!=pqz3*-Z zFRHGTlPs>1gTFOt#L{+jFU_EJf*f$vi&|yoa;^@yZA6=f^m)y8W?sRZ5iqLS`pd!9b?;ZhLErN7@`38g z%lcpz?9UWVG0=qybE&($bW7ce}EmGd%+m&shUcJ$u2ogWp#?>~<$7WRq>t({1SyD(ba-ERR@U{o3U~UtJ1xE~Htq@D>s`6B#6Y-tF&suvmnbSA6fH9`FD%jPtUC@??T^E8Xqf z!2S?FWAMI{O7hEr3{@5`AwRDFNa$%ur zJ_@SNgCy@r_^+MbKSWEsd;lc;NEVn z$cvKQEXNOlh%;|@>5ZR%cGoQHA0YDn{ITYNVb7ez+Q*cXl+nb*L?4Nj8L<~ZK|SW< zD98}>e}F;_@E}nrDmTO379LY8?mh|JKC)u8%)#~ss?adD%rO%}u{La4^Hi^6pBSL7 zQ70txUK%!q!j=RR#a`D-pBdBX!6Je(gMxG#A~avy#T|vZj3bI%J8i|rdp}t^AhU!0 zO)hyLFqJcY2;MsB=H}7SM+ln+Q8aPy%FfQtY)wr~*_-uV(@;702dllil55dpp$HJ>r zAOs(q4+G4e)M0z4x#eRVJSJD(@3)jI4jjPKWrZ?jL+&4m@lB|f*mh2412U#t4 zi6D$cj86=J6c~s+4SNuY(SMWlUaf#1w-aZ|i)+B_`IJkAx1Fbc0<3P*+WLC#+}zym z_ZOV^dfXgV@x+fIWo9_21nHj$2U*d&8aB_~tE3oHQbO)3X(av6bQsyn7gmIZl~B{Z$*m1#|Z+0jh*<+B}KXbGz$O3W%(?Y zPgTYxUI=I@nN@e#!3_m7Pb}UJE}Z-{W`89Cc+#>Du)p3QjDR8EDaY@-&B%%%ZIcdf zGs{boRp~x%_3CdU1$0;9z=6g=>@~pZXjYF<3rj6zW#?5~LK-bUWto={5pi_C(@&fL ztLq7wiUwZ?odW|tMo<(!32{(KMMcFTtXpU{w70#wnLP(Gl=o3?-*m7$D9K@1?<<-R znc2m44{Q4py`im10!)GB52=;!m3MO4s)kR9q_k=jDv6=Ra0uq+n>P%#0(fxYeD@L& zA|lHja5@?q8fJhiH%}(}PGfQjI9riH{ANQH~c~`Heit-wgSy0c_7-En> ze@it2LvWo>N;ULZD8T~Xca;|O3fS0?MAAD<4)b_feikSW%sa}NUx2~ez3+Zk<$&Jk8kA5zZa_Flhv+Y?yI@eZX;Td1|_5UHeK&_JEBxh+8zP$u` zi;;WF46#A%z0C-9XMZpgE7>EE5RdCSBl;h!;h;+rc3S~AXg%sot`LxDP$U7Hwh18|IH=1lXD6C zudZ;49R_wb%tC{yj_lJs!phFJV#5((s-vR}WdATgqu38(2<;z^H}eAPxO%j>=^VI^ z#Hu<{UR&t&0y%I|$nbK8I%2(~a9<{qmX*lyfh&{GfBo|xWT$^S!iI#b^`tP*w!vos*Q2;4VPpnr)YohS#Y1UAkuO4y z03T9Ucb@sM9}h2MYP=al4)xj=jgrQlTK0@t%b7U8y(cBcdYL?oy(Y@EQFu)#v4Xht zZ|YzQleA~i)luXDb=K7(n#`jjLQW)@CH?0ZT>k{yPcZ-XdbGlxFqzTyhY%YL%p~3d zq-xjiJa2tuvX=!%Cz;(TIv9o@JP@K!_|ClyLSTcMZ=3m-0M;%|Q*M9wx$Lo{xcKyXw+e z$$5!?Mem~{`x7N}-1x7Sy`sI*-GDE3Kgnqt6>nF_<8{AgBfwGQFESe8+T7c_aIx5Z z43b!4z+MqXMngM9)7bzZJiZPh^Y=%O78pXocNQGfot07qT#rPTyGjga)KYZ~hhS>H z$wCILphWH}jv^qcaK@*>uVOP4&*L4xUIIaBmma6{9}O958NWwQT^69~%Q0|sW7Ce9_=yMdzz zq(r&>{=~Jm>>WV9>0q!^U@(q}8dag~8z8fVBxSbd;(hGNnXS!t!8J+a$rk(Ogk1vU zlpLO6F}|`1*Nqz=hr5+asWA%$k_?xLY8*6PsI}{Z*{izC%yVQ;^!r)8Mo?`C%@yKP z-DtC;4I+Jby{10wr@;wyQMq@>@m!><7GxK@eGf@|4_5To(e@gDAtxnQ<&eZu(8zbx z_@xwt+f&{Ssw9Bb9+O3=^luNi*L^WGFWQsEv)7tDlUgzFcwp1e9GsVjm7gUDM>ZL? zw`OtQv*mo^_93`xQ~jet@^OfS5p|%{xa|-)T1V)#Y};2V1*P6a@q91sB~5<_u6rF# zBq04CN}Pk$_Ld@M(w_OCrJVZe!Q}?M~cAPuU9}$K_vJ3 zVsH97CMk{dXOp;_5#9>SCui3}8N!ji$hxbu-OGf|8x0x8ZW}`ex*~LNvH=mf8ltkI z(^4gb!-3q=?@VMWY-BVR8ecgCIp;3(78QBxoOvA>*_0S`*tj2cQ7soakFe}0%a7Ad z-N0aS_!y~)N3n3w*gN>Zwbck@je!W=-Z?U$aW?+YSlo6Z9IY=xCksDnG#!AW5!MHl z@Urublx*aTg^5cQ$Y34Bz$JOhi%pn&Nrnl0;%1ZK`3{pZxR=NmjrDhq?@6qJ6 zOs(evG`^>`JIqs_eV6$H3wf1e>ou>#laVX=NO_b9-Roeo2LF=c#~DkmR=|19LEgEo zn=Cl5%~kH$yB8C7p*;X}FPseYx0MRGrtPFYR8pkq=+`qa-QbO#OZk&i=R- zAVr|y$dKAL2Vrannv;+#@1N?LV8|x7_w5)Yi;Y=QcfRvkpg@;At8BO(WFUKtd0g(H zI>SANy7a}zI;}ePE;7KTPj(r4tfyPIK7R2+&%C4dQ?(q9(6X0=6cUW4mH;V909@S_ zW9k2-@P|QI9d{CDVmpAHMQO%(*PTT|;&d#WZ^s9K%tq6zth_j857>Ksjie7#gila+ zj26m?&t0N;w;z;CEiaRe_l1QBWMX%76Q-)fgxRx~yy~1X7id*!0a((!o4O`9$xl99 z@-|NQ3?jfUKM=Ws-;XxMB;q8_TtzNLa6_X_fwKG^{^Yd9<2S-f_V z?b^h^u>Y+R+rBk8t8ahD;)O)%4wn}nn;XAN<5xiR>vIp9PlUS}=I3Q)VI4X92X|Hp zAf!W~N=iZSqHiY zr+C%hrYFy^1XKu+e6Ds~p57cdy000lQTPcsHwq|JC5SUwkVNiF+?Q?JM(!nwV)N!2 z;2>}`Rx{k?rZe@rfkMf-8KO&Ff9uyb?5VtuTF zg6r$Oq9F105ujw>J%BMliQ;duUAQoT#}R)!cqYpcs4p$^&2b{mp1l+OT@+znIbIn;##mfmqRV5RjYM zpbmvZdvf&;4;u@EGKmkM)B+7iBl8;Oojp zdLGm10czGiwFYaTBZI#cC+R?VE$uSd=`z*ow?4^P=X2=ms0pE_KkF=xr=aGOmv?5!%04Ijj8H#5;%C?Jm#m9xkvGC$_Fuv~$n0jT7 zo~=9gFDb^O+}1^I9m!<>C z0abd?L#6^VLCt{1dVk5KrskM|2(tH%-RVkbkFPu9P}H(v-XU_z?=o)3WeU$-UIPr< zEST3doR!6BtM^|IYUqeUc*XIAr^^MKct3mH1#XT!;%CA zkJzwrNNe{xw3mLD`7-&2Z%gW0qQb=YHM>EKm@|>VR1;+5QK1?!UI@Pz zyMGB;qbo!oPQLu6g}@Cr(=wPeE;#W{!Ryc@2P}TP2hjm%OWD~nMWBuO2(ht2cv0*& znQ=@OJQ}p_zZpl7Ofrr##=!cBIa8&G3c0aIWU>e5zkc( zSYD4=Gdz4IGwT3X&k_}K0w$8aOZ>%!O)y)6X9m6S4{H*-6911-ktMNUS(Y1@byGKa z0W4tpa$V)3%-x<#4yN}@^b`;M(WYgg$}_L^XoIO!^bP+*TPh4Vkx`uTc8922e9ii?hK&OFMacr zk`4c#EG1O}pgROvZczJvlXwxEJ{%wQ}<&{LOT|VRk;J9!o9o{i*1R=FTKQXjCt^{ncfh>H*`KD0S zrJg_M4>26RlKY*B3a|`xOOVGLFSjv+McjeGDxvZO^6zm--49H`R@Qe`BmU z*k8h1PevdK_eIaR${ZRJh27q(xaWXwut+;WErE&qlcG)Qg++_ry#*{9N+Y=IF9n`} zx&BR}3l&?Wn@3)=wm#~O-h{^_z%_k;GA`|WX7FFeKVMa7080Q|;qJ5&R=;Q6pHvTF z-?BSwOy&x!f4(|Ub2cd=Ky*TvS%Ws*9zqx>t;@P=3Ycbm;{LoP154`(4m>%SoG5_| z64O*5YC7h<#~^LC8TIDG5Si<|OF$y&?I!i{(o^wCk!Pre$aK!#Zcbz?Ye|xf%Vcwk z_M_whvK}@9GIOJ4?>RgeNOfN7p_!egq^VsyB@48ci6kWa!KWY0ldeMl5jS417U zYss%AdHb+2=;(1paE?bsS+;((aIdBheuo@zayD79OY{B*OF3;%)_~kOZX^+~NjzTn zz)b5$JlH~JhI|TO_BEj#pYEcK#_vAd6tLow1x>{M%iM#Vd^oQ5YQucO_+;VB%TI#f zEFt}PwZeCInWIVkxobE<-(e`vW2POBTRx|xM&_@xK%4(QIGsm9EtlDY3JDmqG7DlT z{NTROX*GIs%+xD0$s?T^Ln}t6C#J8t2flq1xKGE8@gNFow=jwb(?L_} zljB#DrszbHq3%Q43x-qkkZam%Bc1-kRsP%f^}o1EN{k+vyQT?|b>1EUWic`EJ_oE1 z`HuMPwHkRAvGW7ahZTUYsdVKm{d9O1HX8>C<8u=~YsZ1zNlwl2UX44b%$rjr37sIG z)iV6hnxZTdy;Px$YjX=;t8uE|9yNiir=|F60x6Sn`72o%87=?o5dI{e?8~)9c%|g( z8`knYj>}}$RpctYy0fzwgE^T~hLI_MlZ(YblxZs>=`g-n19lTRGLm(h{qP|1)qG4< zwh6Nd(@|rQ{t>*!DFU_6$nbI|0+xCa*a$mFn5mgkmYifWS(OvRHN|?lLH9776F*@L zWaHW^+W{HKSR=0Egqvr0_0U{AQ7J!6P3>nw4JUIfTDTw4vr z7y$mWfC6kxrjcIQcXYH`k`N8o^=RbV<=(#02kMbc;{XFzl_@#+7Oq?5IBJUV&9J@5 zQ%gh=BuGUkhG4aK$f-1wj{8WVR*=d-uHcb1AU$+Mtp}*DzJr6wmY}MSV8dkgIN(>@ zf0$0{3$$buwi5nBKvKSbcBqLaz5rY6e{-m{o@8vkb*nggaZYQ?hmY?95XQ)N(S-pU zh`qZRi*$Zaez`XNNX!R8N|S?>(yY0u8*s#l_kLQ%%(pf7aFn47z93kHhYuG1-9#F#zG?$YxdbZSU&1eseSX~Gx^wY~+a z3vI{$GF%^KNM_9OU(a^HH5rv!LS|8hkyAf|>3B(%EwR|0?4*3TQ4qwY#fr~u7`W@s zD8I%R!=pm_K{g0|+MGh-UJsKe-n+Y~RDGr7b$HSeJ3ISc8^o=;NJ{KCm)P_qYW1vN z&(7Le14(nNcZ+zB02}^lP*70PeNg$(t$jX`+FTm`Wg?8#?i2aN?>b0sET956S} zW-I))414l5oEJSq04p629}Zq&1eY5RNQP9|kt#hZz+nWX*w{Y>t4I<*sM<@BH|kk$ zi2bGc&7}%h|6*t!bVO^Y-2~l|6@hSRh*tL@632&|>M1xwK*IWoVNVd8R4Xmq;5j|} zi`~J|(Xqi|@5iKt45+#*HLmtv*J9h*Dz@sdm*4G5;bdz(~UYV!_@qiDY7B+Ugo;;bJ2G1Z0%{XPgS@y~T2nZGyYWzRU?R+P7dS`Y)VsRYQPJ91&cN?z(0m6P) zel-R!AiXo4S~iP+UXf?1gDQCgN(C;|us-fTr7g@~skZ5E{8zv-yC85Wxv!1ZEc&_LsYKjH{hZ8y;4= zFAz{D!M?VJGEhnTnHRB*!)IsBdX3>a`LeS9sFu&o%F2jnylDv-;&<(=(^64#(?0aJ zZQuNP>Yf3jR+vER zTXuA7xuU?;=+wZmIWBI~y*CV}<=(bJp)`#_rEvc*UwafP)NWC953i`GxYQ5AMYK!X z4ce~Zo$j&?fRP`FLeYSD#kM9P(4l9CP&IjT5lD%xSEWE%YF0w7FK(HG=yl*V)@UGW z&btRLY}1|OG2p-%?FkM)a=cznPA(~L&f5#TGf+L%=~j&fEYvz0W4qS1_14V)4xzzj z)!(o=4X9l!virbzQ4o;PI-(2<`JiSQE)8ngZzJu6L0#>Gp7kP(Y`QMO5EZdXkXQq? z<6hn8bqt(tLRlFZ8UA%_gyqZ!*(L98MONe`#hK}$P&yG?JFejzpuD4rMD0f*^GJl_ z*)wO>c%-d>^p@EzUaeS>c>}1?B{2VcWQe9{`1qTS3{8@D-d1E>7Y9-!A2a?Qg{mHl zwaN3^oMb1_lVyN_Y5}h<;G;hnESMaI$1^kA_C@{{pyXAU?~i{<%fQsqncNXTBmargY(VbVh*pFIz{`D)Vuy_ot z+NsFj9}I{W1_K_J6+=saYUGjw1I6J!0Pl9Nf=q-660D>al*hCh7C-qhq(5S_uLwnTyUBI?gpvyA7M2`V6t=eq z;7bD0)X@q<_X8gI`S}5#I;$ejfyDj?=T*#R3A(eYpip9V!*Wr^KDpsVS#lYpj`wr@(QhOg)q50lsRmgK#efpxI3(MB} z^YIF|IinrN;knh-q=P*}+=1m%>sU_C95ED|=VC!~=hkm0n3x8gCCi%QR)qAM&t4XE z=(yI>c`H}#iuk7XJr~XTUCYQAoAC3BLT;81UYOgLzhHa$ZY1FH$!3wJ_1&=w9w7@F z3!2uLC0!$Y!s&x6 z%mGlSI-Oq%q5HEmhMuGDit?+hFMKD(&g`w{H~igt2?=$wt+N~hb zOTBuBNxj_v0n|r89=ij&PXZ>)$lKcIE*)NyG&4-=@~_zb_~XHL z6(|ocIJKqatxW2W*7#A{(LEha*~Wf3IPGHAKj)GU$3go2M$tn_)j`AuAYKGt%8V8W zP&s_w+U2(b<9`1jGybYHaP!|kd>V!MT-y~xoT=3hEL5JQWme!m+?u#F*9A=J0sY_w zk>E6cljDbj69V$zFSwgH?_AD&stb!a#G&g?+CkWO2T{D15r91_{O=f2G+X(_`!tRk zwF1zNmijadRLR!+^cZg58YIZm{Mk5VJkf8Xs07wA`@=`ac;EBH80@jgERKa5kL29aaNTa zQk+ldSd_H+KAhrEfYNF{U}w^=3K*PJ*iDb4rz3Bl2E2{NQ|>{aNH)i)OPplS(4Gij z3-Im7GJ9S$U`M|H0ydVJ)44w>8Q0kyO;Njo(KuXa6lmbUQ@$E=<`B5dc;c5rF zwZSBu?;YcuxkFRn*YAJs6P&cQ#^Z-?j|I4h?K1|XD}W=sdVGXThEzG2(j^#CnDlV- z@x$UtG(7JYZrAcr6e;t&h^J5~L!B(oKuww5YLNv+8}X&)YnsGUalj~LT0YabZdVzr zV?>c`g_mof3=LAh-%b z{L%3cZ{^RhCzM7}@j|u%a3uAk<1w`92H(!0xjg?OZR{A^(-USULB;#OJ34_g<_|wQ zW2P?;N2=5gZYA@nF(D&zcwAvfXy=`I*${K_n?J;9lHHo4H*Zdb0ZaI%)X*bgSoZN( zses6td|NIW_XLAnsWZengVV?`1%uE zpCuMHAL%~j*sc55Sol+9ZAQn&#gTBJsVJ#qwI*IWx%DU=&AfakSpdokI9g$6QY(+{ z0pp0%$PVdgiesU`+A_q)mYR-uCJO?2>mr>WNycXx&WSufzZ<4TK|CiEl4gAj%6ibH zzypne)c`S)*xo*d@G%>`LF7ylWfdbZCH%*xCxE`z?unNphp!uVB%2^hq+040n z`eTD*<0#NCfvFIMycihkotUK5(dBc?B91Y( z8B?tNXyqgANQt9S2FhpcU2_XcYyYwKT)6phd)iglujwDFie!nL2;$snTsg(~jiT7@ z)2M8^+9{6AyVe2o!R1WRtYB|$O+Y9zbFOhYf3K3#pkW$c_3DWLGGd-GgC<(qr&o$R zeEVhhk7Z)<{%J=ou;xy|V_6jccxrhF=!J>TF5y(jI+(aSA)FoH=j%Pp+L`1?m3Q>4aFm9dMUR~{Kg_2c_`a@be5EH=?lEN zDrmr~b694d-9 zP?TBSkEfH3d2|O>S!yM6_N>|@+Z*PT@BAY{b#S8QZ6cyjIp%P#_SoP6J~(=bYEO81 z)6of@>G28$+jrgBQisA4IbKler!VMVmz%=RjGu({$VEht`}x%8dVpo0}VzQYdFN4#eG?zuI(9^M#BF%Jge7y@^Ml{cl&x zpEqJ}kn#$@cw7rGKygc}cozg5J#-05?*(7IJLeQHaDJ%2zoG#&D$#_bwM(*p-`-WO z7AZ|V*YN8k*0K`=Y!K~lw}05LPT{$JlL=MPXKzRq9U7Vf^_JHjMvE_lf^PamDW{)Z zf`WpudF%lZQ8N*#?|zCs`&~&{S?E9Sp1j3|cG9I@C*FDW?uqAnKYTMFG;3L~Tet6k z#eYLc2BTnhs$2ut6NY*He3_oiu9bxR_>h3t$@xq1#p_=4C_{O+hF_M7mVA*?A)6Qb zep8**VsGdPYE5pBiW3ixC3#17ad!Sp4D1)A!WzGG-K4#{{m;AUIw$sBxm2T<@1|!% z5VG%4IP4Dpk1x+*#dalKXMf4eozUo%1gQgBj(R);daI7~Mt??wldt#4!}Ef#F2eTw z(rW%0^JL(k_giX9K@Pd>E|d*Bfw%E(Ttgq9SK#91^R_!#6_eOR(U87SS>e@sXJ%~m zcH@0#W+4M9k8iJ888i}Qw;}Se)Z&HHN*N%*8cWH2iFK0dn|wRYtOi@%NZwRzp| z@0Obgr?oycn zwwU|<;8Pm>ZhA_KiR0YuAB-uhABxX{G={&j7S3kwUIl;h6j2rAwat@rNE z2n08f`1FSEHO_ke0D^`#tono$%@c}Nc+69p8C89zVcU{R?XtGDWrwwOcT3oGe$evAJ}HUa z99%^#Jz4>;yLhwi8)Z@0&rN@I^2LEn$yHG0nRoI+rpz@72_YJ1^R?=C3LyIL>C_6c za&SQBw-fU?5&ph%wF3^=YFG6otsM2Y{xnsJg$gU$kk!JlI(CC;*?F>mKVYWT$?Aaj zcH^OfLOYY$wHj7F%#M$MwJN^zN}RIzR4>OC8}0+%*V~^@B(tLgOJUuyF;lC0+{N3$ z^uZYmN~u#1nSn*k{Rm{}FFvyn3i(s>r<+XURH&8%gp*wzy)aPekm5co@1f1G%6 z5_mVDLpF2RnfqDlyONY>5Z*wiQ=_TdmMAPOb~IsV3M18np^vqM+Q`~JN90GcbE;bZ zIqWpcWenR;8F*96I{Hpodz2{~Rv~xgRT6@#MniPJ`Z^m`4;3S_`@9v*NKjh{sU4&5 zJo8?&-pD7FCwjww7~=* zl#eIrt3UbQ^0s5dX)GVEE%Q^JS^e+s9#q(~;8uB+{*by&25NcjT-yP^baRtNf{KP} zz4q?NeyxYH`_tiQvuVE*wrwqc9g5j$Q{$15VxaTVKoa@0ViSdRFVO||s~r@qP2<$F zxAlr+^A8_PBV^L%HLc+(j6fs|y~+buD>>g_wL@Rv)$f1$6Ax*GipOtY`wI9d@(%n< z#U1t15v)(nf<8O9!M&<^ex?RWDT{{!#tgMZl4W)c?R^+Lf`~tAdGsAB|r_&aV;e2d{e(PPpLUKWyA04RhFij6{g9`#_@b#fnwL(_A zs1YAv6|{c?bK1ws6RVXsqewmZ(7)@M4MaVsNn(Pg8W;&D2|`4W7>R zV&ziOo!1wB>6)+?n0n8@mA6;#+5Azyw%48Wkp8p@D^AZRfiBg>sURTjXFu&$5)i~K zZy@7L_rY-^PSl(oR4E)Va0w%FfRU~2&QRFXuE3PI{I2aT?j{8$EY#+#MMrvRa3E8} z^qGdj(jNBf$`$B)n^m{Gdi+G`(VFhaP>J6S=+;WnRE64stciQ{Wr)cLjGd41ZC`VN zxC&V)L#cviwlRwtufjnjOVLkDZyQX@D^{-OBCVu})YIMI0~hsaWvH=dw3emaeRVX5i`WuK zMN706Tr4~3DJ3U!tM+n*M(S{)+20Q=O*_T{n#&)IP=gaWP#0A}X|q0bZQwxDN@!M! zl@oU!@88o8V^X-TMx*y?Jrt=eO|n%U(2pc=INE&u?B5@7)%fAKqncljJ!NQoh3wvq zr`wZvk!P^I1Ge-4KKIh1>upXhmcvnba_@J@Y84!j!}*=t%KU8SaQM=SVl?A&56R!X z28_A)%^fLPsW7wAO&)`3lIDzdK{>m9AH`Ox;WoVv9igoK0a5LjuFtxf#HOxZ+j&!2 z-tZ^1zJchS@x3&ZFT7(k`csu(D~K{ld4MjU0|f7BkQPvhzt?_^!8_bYnyBqWU!c^V zNXveE#`o^<3E3Dj0wnpY&HSkS{=#X4uo-l4+DU#S zDj%R8GP)sreufCv)*icc($OLv%`|b|_lTT5UE z@8+)U^o46^J=9(@P$--fsWlErB3-E5@4;vY7%ikG?A)M2(we91f%>{1XC@E%svs#ytdH#>ix7HQbOJta}B8i z%*u`_L^&;ATYPaJ{8I!-ZHL>n2UHTs-GdXYCs{H+=mo~i{0eT~b_=j0Ei@Gf+=UBC zoVqUHZ$xPmD}df?s;nc`75R}*@n%EDNbM}J$YIJ&jPI8kv1Jvq>SRjRobVO06Q-h1 z-Lc>oq~=r&%^7tyG~KV5P0H-v_!uCv@x z0#bBjE%WAr7pl3hwLwFV98e9+rzRadNqN_UT>-igY_8q9`V&SzX9FS`{GMEb z5D<6f^`sMr@#D$C`l^QnDo$i*PM9mUW;z+17LVLUOS}!OQ5smaPC)6G`lwe9ZRJz; z3FvhcOs^r7i%PbJxr|M@aNZzjRr!vsDpUdF|AS44GW6=*WM;;TuIA`4SBZg~N<=dE zDHE!ZNVNm)kw69AtUi7C!BEk`f=jJbMV@elxZ#03?)_AmMLo}hx3*^M?1m)E`ggv{ zeIgj8hmC_*C<>Rf*){wvKCz8MV@crBl!_o*UmXI7HIXOnWT6P*xlOc zn^i)sVpiSY&s$qNrW@Q`LcLAO*1qd0Y|aG>@f-N^ecGh3G~2--BQxH@b8n)V6fQxM zLP>w>!u%9XPA(hI^dK|~759Ah-;#Wuh$T-G?S3Olb{YW&7NzRq`16;fi@K>wGi)BY zdP;6yp!dBdS7_1U=Jz88e!WX|0)8=O$0%w8eMXi^CzW zxtx8Gl;O}eA4oLQ8K>tB%lRvFrR0CwO4ld9hj4`=Tk71h%8 z3r~lE`2HB&p$r|?diU3XY*SL-L?JT{Ux(Y5Y${UcC%9us>u64ZY-mm*7 z#|a?~T{Q)w!FkOC`w1zUyu1gIBV4@w3*n2@nRHd*Nd6y2@$$5^*?;P!_*orKwA;_} zd%H&-qp~!MzK+su{*~lE{k01M>E1tDN^5;jvLz~=VdniVAoYL{9Sd5ghSs|a^=j0U z7c@drLu~bzw-a0pB5{EiQ_YaIKD&aq)axFn_ES~*f4us9B&tT&?_KlKi#G@EUE7j! z0(KWGZQwVS3Ki~ZJ92I8Z`>&1TjY{B9ac_?Z+i7s9rOHAp(!H7D9pr>H256nIpGTJ z$)E#4v8fne8Ppln;+Jyf+78cR%%V=Rq`36tBgZ|Dzn|QPJKgNLd(De*`1=K@Ugbzq zYfd?_WlFll`NI)@EwR^=(^U317c2XpBbl$eF5TL_cKUmdjf{-C+Pk49keu$+roA6HqGQ8J59QW! zq8wYqh$FXQ_`-xsEVFCWfii#Hs*L$a9??exid_Eq+fN_okKL}s>orcpqEn%#4^${I+J9mz>3Kk^(T(}dt+ za4P!#ad2*K0Mn(=^S0LxIW0h6eYHkJoq-p)#8>bRzP7k!tjRXJj{zg^Q`G1aq za;(gg?9#>)a&q}I*Bgh4%t^020^(B-a7;!A=4m4Y6%4H2mJ3K|;rf8?F67_t_EQ@~0k_NeDEUILoOQOF60~(J3%bfKc zi&tvbm9xolzcR~Rl2nkfULZD=a5hMe7-dGzzYAYkCVahDXFNXN%j&^!i&<^eIM+xzNX&PKq0{fOiM#Z;SXU2;YLLFh*A&psQ+PG>n zMLH$DRcMcDmc$4;DV|cO_|{MN!t0*xb|UZ#Uy_MQ#pNO{mQ({T)~U4o?>GT%gELVr zL5ONQVDfYZAMEt>-;&c)zVU^*EtRE{$-G*#$4K@mBmC4CcS6f3|#wk2qL~nW`b; zr1GSXhcxMq!4qJ+rcTRqEcTtHZ>9Z#Q^Kq;_KXm@)V;WhSfzWpGcn8cxbG}vPdjjFw9%k8R@P8%73R9~k9)Pm^#f$1Thr7m zgaUGc3*U?_r6_kKHwkG+a%`7*mYs5{2+!={9$DLDV=!d465Yfa~vA} z3(ta9@uVTq2p{3EEXw>i-m6k8yIYSg8xo?q3FR!X;d39k)Lxj zHI5DV!oEzI?ND)-Vzxj=7<=YH?%I!p^z_TLN)jy{nSWJ%5pM`lho65ngZ_SU{D zh-dKvf|xhrXnMaJMR4*j;7uoDdTsOXu0zcO)S9Jhv|BK=;q!O&pAN51cyp1mnkL+- z+#%~w=}rO#bPOnp0*XhR6f(xIBJnO4dG-Qdf^2Io}sOZ;jXr_dK2G?KdTSVJ2QSJVZ#5NWxEidu|zPyRcLj(ijC( zJn;3dqo0?uMkuU)63a7Rt~Y8CDyP%ecP_fSB#II*yQ4krynN_uNz(1+bv0@M3@X!g z5*wMS)pn-D($eERC~J>}R<6|*;H8@iWR}?)+G^E!e#i-vTclCQ@L;}suv*i+Dov-D z>s{*l0?(ADug5>wfnO!%zuG+3{FGx8`*tsy4Xw)2-fLZ}6X><)`)#jj^LLXD`GURE zmgK5;)}gv!Tv2k=+5Go6Ymie}MTlw1f^pG8&2qz|XV?;eO$SQeYpK2Mb_kcak??6` z)Y7)|UHpS5m&h$&yLdE%EYv;^vwRw zhY`XW>s9mxDt;VskK94II{kO@?Q2>|i=X*Ot3&b9tO;68yC0J1ERN6TlWYg0lF3F9 zJXp>Qtx#6Jqa#pCb78o$QV_tJ+H$|KKYX034Qqk`G~0pUVRYeHr1D6(qHYXx&G5_? za69G?MKG(!7sg^kakW5KgT~L)o&`&<&clS1W0#n>D9(4hr4T3&ejaB5N032l=kDTt z5W}%(0#*`C#}!?hmLz73H)b?-%@V7Ccx}n4+Q`QU#I@fztJr)s7R4A_Uj*ni+R12d zInP}F6u>Q3YHbbj*og61_%x=-c9|C+v=uyHkhI4D9UmORIpgHduFx@c?BL=h5L-8% zJITq&I!R+W@Rz}B1%o?E*({jcz@a)tjmpZ(>ci~A#^YUZ3lM!}?g;?*hlchQL63%G z`~~^>{wfb%)_-yPpgwg*ph^KE!uph;{%;|!3KZVVBPy6!yXE~jX(n*uf@9D~UsQ9y z?(TjwSRnzLQ)lK!JB&91K@0?h^S+Taz7c?9b6Vo327=k?b_%``VK6q&w z|LocN&8fdx+PRmHg74AzkuQydykLv*emAX*L<1Q#8lT0^8bX=ZJ+yj4&hH+8Gep?g z+24bkg(LjsFMmKzCY~R$Z+g|+<5ICU&kt%5UAnAKOn+xqdqcw`oh>hdm@5?&6fDhC zV_~C&^yo;p4qN)(U)7P0@*CvVxJTCR79)siVlBj;vI&R6%Jl!V3|s>EV&q!=yjmDx zF6F^N5(l3Q4P#{`P^IB~{rciW*+OqA>%9!9*)##c%5{ME@M7Eqg5E1Eyw1v6QTa6HgnR=Z@QzA!u87oRfa(`wKf3$ z=4-QHEYE?4&r9+~{ETmz17_k&JwAj|RvIJaITN(VnZz$UHB$~O+b;W@@V1N`Sgf+2 zNr50~fvU&Yo9}x<5-Q|jnHETvxSumiYVCv^AR<%uwnbt(U5%Cl=Q?cBZ$Q)|5d-F! z%ciFE@1N4DeM{Pr+NSt<3`FYrd2z?8Z32ifXihy1-u_aJ)nGcEy0(kTgka?aN|$ks z)D$d2>4NK53QU}yp5dpqI`!$q=*S4>a#LfXIUrTTUESRxowgLy(#i6bebC6t*iu;4 zXNtKLDr2uBHMmc!T@~N&Ccs(iQKcX+-@8jP?AvjHs!z>T4|ntP_i+FsnzgpYlCQ1N z8Ir^e`GGxWL}p$|j_s&&`#G7i?gj;JoCDV8+9$W3he&^@X}VBRHeT4>yIa}B<+Iy! z^RDaO2wr;NL0jZNoSBq&AfQ;Q2)OqnC1PaJ>fTVm{L+m9?+TTJwnEV%--9m)2~&96 zYV*A*`IAr6)6-Y&AnehrFJQq*C}6hnXo(gO-eeGJn?u!^FTehkzQga$<_Ftb#8ivr&t@uXuTLZY)Vnx4TNoG` z;w9R$NA|{6vjd*DKeoCoH`C#UgM+2By?v*rv884Hb^T9$>+?k#NZIz-xqT+PI>jHn zRKfmGTvv0wOj8widvE4kr5F*!CIH*T9l=irc@LFv@@+o9@R=(^3IHJuz{Pj)o@zYm zCNLb#b;6EfJ5Uv=;SMp;Nlbh)R@6}~p<6#+xCuyaPIxU1TjClppWOJmY{Y=!ZDxb7 z4_{vAr_C!yL^3CCMNs$4#ZyHD(Y${&<~yDqQkn2^p`8(T)8A>%@di+Cu-x?R;SC$B z%UuBnA_j6oY7DPK+OHr+b#)QyTIHrMyvoO2KLP{>p7U4I6sU@AYj3wa0(;Qg&)0hY z!=@@vr1E(%r~0Cm;qVsN6;)~UO7VwBIW<;o`L;t8GUJYbDLJcX`oLIWw{tC$R_yTe zpD2e_4XcCC6kII)s*Wrkc)%0EC;RfHMG~9K-+wXTn-1C@mKdjVihlry)~mD>^OYYD za{!J_M3B{QgEyDh7Ejo5NJ2^YAj|HxbFP!;D)4_Uub*Xc~e{y-|l$yPx zV;JU#V&Ikk#BTFg9PDbB7kt;l^f{5e$TYPObF#ZrU14u+Hr?1nn%*mt|^DjHt(4gcOe#W#*&qo*?5~ zm}Bsvde4shZdse}cEM~r_w0y$bxBD{1rA{Qa3sdJDje9GEZ$N?icA|1p>8LP<{*%- zSjyfuj2c`>aH9{R5h5`yt*x~Q5L+=KRq+}kiSOkLo_nsCyKB#bmx7R9BcC_$5=s$z zH-5g)rNO2uQ1$2P(W6IWp-GfS!to!9<$3T<<;xFyh)v>$lqNse**gj1H3Qa0&HS8b zCkMWEa;I*Ijw%!F(sKKH~3m;>4%EeP`p|y6rq=N0yw>fYVi@(#?My3ReYf`RuUEoZO<7RXR~pJn-q2 zzk1)*$I8StYZ+G+iC&#v)*eB`TUXv@?rr}3w-h_iNpj}-Q#%>a&<$y%&Mj`x{f#7r zfaO^w>gL}F^i<5;A?H-TseC)c3xWB0nLCdeQD2t7312(VtHdw9DOb{9tqfh`1kBi}IDhM!5K={Lf`8UkDC{L#q$f(wj0*65@rzbyn&z zeH^G_G@^pqsh6WgN%a}y*J$UhE^WNf$_QNDTD&q5C3y*_2?2qRgrs8ghYB|VfT}09 z3oA~%jK@Rbm%je8P`cCN)QjMOGX}=UxWpy!F6Fmop6xn}xfs|)6vb6Vi5nksRe9^& zmBe8tj1ad1Th#OJ)b|sd*oGswrthM!y0LwLIVh`ecBnbki*?Saam1X4!C&5jPU=Yk zuj}dbAVLG*z6a1Of1W{^PcpO%ZH>HXn)H9 zWX^VSdwFP7stoe2Z{JEQ*5~>VWe_5MD?S&r-vu(IuoiFTi=G$8)@=b=WKv(2P9|c* zbV}*g-<~`I@G5ih4+It%%qd~x9u@ZC|5a?s52}zbNdwPLY_V#y#&#bi#;krZW)%r) zrIlt^1%7d3wf`_iFBD4-!!Ru>$UL=O@J6U$&3MkiMS9%ir831t`_ACLbu`+NGVQc! z6})}IaY%q6a9<9i`$7TN!*7pu(Is5eC@ ztwi9E$V%}`COFfK@mLaybQrrNJe2aaTn|?O!Pl&t5?u9ZA31dd8MM)b8^X72Pu7On z&Wv3DeD7~yytI)#h(s*qR@{0K;Rwo*Fr7~y!QnrDx|_wT7(p=RMxzCdW5R>^53l6~ z2W>*Md;)47fuQ~woP-_CSku61u%dg4tsbTQ;G+CnldeGi#k~zYlHo9ZBOGJ4chyLf zSC^|WIY`6@z;9d8EjZ``(&y_=9}=A@kek7n%4qxO3Wwm@=J^VeA;5~zjrId1JTrCL z>%iB`Nto*3Poy*kYo>iczq{16vsk2AL(pe0MEb%S9zoYoT<<8=iRx=l52TGS*09Nl z5vbZ&I2iNLnh(D%k}p@%L+D^~9*Hw;{50)AvKmM%$c1;w{qizq{%4g(_1h~5y9Oc= z;zk#GOMg5V{-M~*g9NDe_qc=W^>_!DqDr#{TO2=ZQHnw@=(ctw!RCqAW(3?pmDGp4jX%F*|T)VKx&^f08~EMx4#mYV>^I!Ar+I|bnb zV+MZ+{f8t1T>U76TII^X+vmGnFzMhOLCDLAk~eMApN2;=46g5CNIr2!*s6AS6{%Tn zO*D83wFQV*85`&KZjRM3*aW0%QXgUkK|jKbeh%WCH&v#tRRtdgV;n~F?J+v`CJ#wh zt1b&R1~LRp4+Lifs*i&DC3RF!gI#k}B-D{jmFvhOBY|$5$<<{`{55b05yeS!5lYwE zSGn{sZ&%%uy8p7Zt$<`4L|R2huYL@{Pv_a;8wwqtR#X|?N6h9qdwMK268Sv$XHb1q zdOw}4j%j7q6(t&fK|!#z!M#=)`D@Cq0^2qQufQ0*jWF#Ag!zWzT{fO;FrHr_Of{dS z@1^N6h`{{`q8^T7g7zs-ShMY#_FxxN-b>4oZkGh#q3Z70N*fw-5SI!ciPH;4w zem5~(%HZp03L{$GdTD*7{!)3BkPW7*Z=pQo#mpIp>qow3PYTwt2q6(LEu1lvdG(`N zrIYF$$(}Q{yhv^qYWh>&NUE$awu4r^2a%z{pAZ9v@Wb^hAksRD3%0(mkSGIUX$Mc{FvDQx2f#%9P2MH%Wx z*QR3GW{oXANSF&yZ3Ly7c%tgmVXNz1L72s3j5V1<6#*mF3@j3oi?`g=#o)`#NJcju z_(kV*`c*4k)cs=6n#suK`KN5@8iZA1PA+`_w#sZnaB3Wm<#>!4!kKdJuGHi zD3=j7p4)-1bl#Mzujz*#E@TW!-H@q1>ZPaav7}oJ7XF5|&i88D52wwa@{t>~L{#h% zuA(C4vio*d{99sI5SyZ!nZR#)p7&(GTa4#=Ro_C*5hveGUFUsC50Y=H=NAi{Jl3$c z$tcq!m%8`fUth$NU+=jma6$9@vF%^JF!6r*%XA_1NW;X-u@ZxCQiTUtwm*5C{DjPN zAni!i`=Fqo_rp8n?c;tXep>M~FS{8O|Fven;Y>M551@Cq=1!cB4GB z;xSab$?2aFOpXZ`Qu7@Hw?M#WNO2E(q^xt_>AOu?kh{BkK|qjru63@Wl&M8aPtONs zd%ozhAAhRogLXB`3l;RRp)FF2R^L=JS^cW`PEaf(Cm`rqKRi7AFa+ab6lZD<3q!rg znL4RKo9nJ$_^M|4GM0o+2fSt1WbI!C$dT6|RR5{U@6?Hf5BVP!%G~3n%NGL<4!qiX z7JqlqH&val)uzn5K+Uc#$1(|WR(X)>=H2hERxf)B^CWNPW()ZUp|wR=uX71$pYM80 zA7@Rm4r`rXqkKNjDry~uQNeZZi%5~@fHL! zlyY)%Vj>~c!KIU+bnlXZ`dwyA)+-n1eK(oYA58`6&0SN}WWB;BBk#r&{XVXq^S4Fl zl~4O{pLSI0U*%(3Tt8m+K$e4D#3NFaQa*f^!|L$DTnp1{RI@4cmBSI)_=n}TAWOT<&gvMkD$N!GbO(o^$y@7`TsQ`R~)$eUAI*9Q9q&kXU!3xGI&4$tUl?+jANzR<3D;Y8 zmYl-NkG)*l?P^kj#)|sdfPznMQNS+pT3O5Yar(=eBhs4~aE0+a1E*y-+D=l^G-b43 z{)hwrEycSOYcdz7!L+KbkBBXzDHVBaKXVs56TIwbf$`U1bYqG(x1W*1&)2op<1!jO z=Maq($y3(+FPGfSD%>3{AD-EfK@!cIyA0VxYS7Ri?X~F#AG3dY zKi$bH5=sDFuXX2^^F)JF6#9g>x0Iwgn`ZZiTLWBG`kq}|7H>q}lA5x8DG3f<*|Cz* z-pfU{n=yynhjq_F9>+vHmAOw(=6@{kFuP&m0W23{i6@sqgnL`3(#uyb_OuiWJic$(Sw7C{g8!B zT0*DqQP;ieqCgvB<_&b#7X&b79X9GrK2qlpEth!v3qm>LGG0snTue=d!xmL)0oCdE z4&-;cB@^-JFPrr=0!)CL)p4sfA5ku6jzYFeYUcd+$w2R>`k?ihiRnDP@&U7|J9kic97v;v$O^c1obEBntOL=_7%2$Mt?`=lrnR>%h z-P|P54led{qJGsp`wRp=u_-wZNwRH)K!#i2KS2V(pKWjD7z|7C;r2lpZ^XpA=BNU` zA$K?tk(ATjb<6z(3mK-0!x2}SZ4v-_Ui=}i28xb6J~!7-OuoK z%F7SS36rWjZTuxbZw$IyEu|w!ygeyFwdh>lMdR`?hlJVGcLnpNeZJc|)cBKrNLUhg z{VNL$#BOQ0o-UNa?Z^B(^d830WrY?4BbRp2CQhP(+{UaRbI3-UZ+avQyLUU5gAluf z_=QU0y7J=i>N?lJYl9mZGppq*q#q&t+VXzn*3Uh@}YuwwK-Xg?`LDwKlU zLZY8Tu{9*~6L@!UAImDHV_$sG=KpE_<`I(dXlnhFk}(lY|2~Pi92D}7+vujk($%h^qMeHIj~RjWA0hGKf_2W{C@qKAbaM4xW^mGX{rp(Ggh_To3bmy)xrmB`_uc zNumfL9=;Av$eWuCKFoz0&PHM=gD5Tf(SCwV6JYu9j6omB9R*ou5RWr!w^8T4n20(v zkR(y$={LLr*5=*PFg5x&g7y$IqSh5`%93Z_9`4 z{go>f*}*VZaIf4&5w))#JK65F;GBdPI*X9;*i6?hJ5?ruN8u7mqi>!dVxySJf=pnK z5kU?kBYA0DHjy#TLvN9B-X6qR(H+ZnDDJwqK?Np+3idJrxaZwA>YIH;7*e?4GeUUw z{H)-35;(ZA^e6^#E~BRjvjHX>zt3(458>gA6U+fwktWUM1FmNaEjVkimz)3V`7M4| z&&VZ7nm1!BXX>LL-O~cPM1SY1VM*af#Bgj%Mrn!fuco&Am$B=|Ow%5uGvg=vRl@Z7k4&ub<`HaKt9mB zB@=2aW1<9ft0}t&S2~t)C~{oaLy1d9`O$ui!@sObmD2|~Heou;Tad=Hr`hq&b#PGe z6>lhBT_{tR>Br*zu8rD}^cpraChaOm)XLW8lkmtC+B@Y`pj1Z&qH;O=#$44!w6lnJiXc65L6t<8|XWF*_wJCoR|R%t?Jib~yW1U&$LStDd~-O*8UexY1h zS-J3AOho`b>Sm~r@AdEL>PsW9bM790ao%SH!j;Q{s}87qv39$@pkFLo>5mw0Wp#CR zCEIXctaIyzANq3H)OhEpsHlW4Ki{Q_T#Zu$MSz~igbQ-**IoTbZK0=`C>nJP%KtU?ojnX;FA@mYsc3av99F9nb?k?Cao7b-R|=V@d;ld~=z0oF}-;C(9ts z_3qlw{TeUMADH#4_C9bm`DSxR2Oky?AT8(L#xxDMBWUcBB#-b`k>@*Y1O$&SUJrBQ zrP*5@dvShoD66Qq#MgZxw+~>l?Kb|`4U_t=#XBi;DE)l&(LN)gkOK74SIm z4097MiE!;?QmjZx83@^R_?o~onU^4MUgqUJ)(f0|9CT2FQ~B2(^*M^3m@cT-a8Mf> zo6>X+-kB;K6L44X^767cV*UA^#yC`0`~!cw%g-Np&TF&k!`h$y^st?-S+Q&XxA5;; zxfdNbi>MY;s(y`)`RnNDR992o@v}~;a$9{Q!0;X98#sJ_=G7`Yix-E;sz_zAx+h)5?b-Dxeakl-Sp|5-0D}#f8L9 z7^l@3bD;JsI0kCgR~0>lqAOZon+QKrvz*sSI5p@32B^mG^<6VR9!gI{DeJNOs5EeV z9;**+s_eX3TU+amTrsO*FnoT=wBSZ-wp#C}o@dID-z>qXZ2@OMF%-@6POW=6-QLrq zT2WOWN1*_f5W}>qr)SlY;{Iwi%k2Hl3?U86i8BcqEl4QMvVC*<7eE##pRD(Wn$lJ# zld#rdE_#BH-j9`Ii>tpYDB6c#N6ar+&aRt0$!j~0zhb#3E1yxfm)L}Pzq>=pRD=0> zG-`+t<{l1XzTZQH$ZOa-yrkH>?ELa>0Qn~5loIdB28x(U3;pzgL+7qd@Z)!$Dy{;F zeY()G0n;>VL--}5y zb^-GM@{3W^Q9Fw_8FK<-9rj|_QtER4uO+xl-edZeev0lr*+hZk9h?Vn6~LB!#aH@2 zhB$Ejj81(f|0DBt?}dvcJ4uDNX7&*x48!Y~N^-7!U|VE0&j|wG5<8z)t8r=DA%O1S za;e8$RZ*$W3|bNSW%z4wpPPHp5?q4bh+EZ}2ibUIfrIv!(9Bor1BOOQA*ix|Rrpu- zp-BzvPky&u@I?&Oo|uN}N;ua;=DZrX#Y0o?8HWwU13k$%Q=dD2f0ot$Z(~F!GH~kN zyr>(wBpe*dutZbIh$2bxV#f~QMe~+8O6t}QBCKGHXuGLho+4A;oy+2r*>JNsBNpIR zN%peP););AeQ>`1LfH)FJ62U4AO(HdzF@(+3 z1ro7ym7mtb7_Yt6hHmhttpDzyY$Xu`$?gZU-|zEG)dtn|Z^tsBID9^0wir11%=z`L zaDySs^DxqVyx=|;(O?|Wij1H9D0Ul{^)k=c|8pkc{(#XlbCSz^Ts=kz)m5Jv2qfy%oRu|=|PDjDu zAdJPo&m)octy$RO+^SV>S_Kzs+ovA0L#Q&xMrEgZb*@U#{@R!&YNQ&K>9Sn29W@Ca zAkClaLlP&*;2cJ}vFD_Xstw(u4lq;$135&$GEVZPU9-9_--lb>!`P$RRmj4OxHFk+ zk#MWq<8<0v`_L^iw3DG=wFIqntK4aQjs4|cZCWW7VHgqd5-}>aD+>82A$@F;SykzK z+O#H=9sozjf0$P-Yr{dhk{gDqDZJ^t4@2*=Dd#KRk7$%FhW&OL@kWS}b!DQ*X$Qi@ zKM*fR=81^x>AaO!9eyMoGJ`YZ5Y9C4ROE_F%(BGlVw4%GSL!s%F@xQ_i`tP(M`*u~ zpqe)21EMP%b)Lq|1dDX~i@NGCbQU8El#?78S^!B;40YHbun>^o+uSi)i{p2!0LvSO zJB0iVC1kX{+?2H1&`j{k28X}9ii~COD_&z$Vcn1=#IT`AHu+l|Ligz58S0D9WigsC zsm>NbHVKrl4R-X9KazhZ!3(!1g0C@AQI{=<#jM9>oo^}w*_Q^wU+&(WOX&2Ai&$R1 z?9VAm{K`=HUqgl0c)kH$42Y&kv%p&;XKvf?lu2UG>1)T*rI7__F>%N#ooJ^@buMl) zv3M$nIJ!`lR4Qj0dy*y0r2d#8ZjCn~+Nby@0h(xM3A-Z4#aL8>Cm1s$&%gD>lP2fm zDln_c423^a5@DI>BHWaym4|%aW`9uz%l!L%hIIR#=V9}1+CzrjU~m;N*(m;H_(g-r zC0p9khP>H}=&DAEg)bdO{T3YNibyIOtM?6Yz!)rT_AsBlt}U;z)n9$%17_%llemIy z@;oJESgvnuDDhZ?!h=`sXx(Z<^-Z2&SR(WlW}`sWsC=>0fy>RM!|PKlmQ`cOgi zEB6PUbe*Dh=grMfwSrM2P&~S)Sub)oxh(WIL|-nW?ij?bN}Zl^rac#$xv%NY@N5_z zMVL(6MRMvyN%lI&lqbz@gFJJHU^$qD@#l^Gan+evJVi5i_Wsd4`H%4 zntLMDJeUA-XBLq=I;f#e&LpF)w=y|1m*n79CaH7(Hb-omgW)>C0q^FLNQR72!;asN ztSxijcBeT&2<(ULQzDW!U>K$Eo;umEPHOB4#YVS>pbH zBL&lg39BDkA#FjW_3iWl65is##M@7BN*y$8O9eO%wGfT;+k*PH=zZo}!2UBlBMr5p zD56gH^>A8O8Bz*ai6*OC<70WkEWL^05{kpmpZsg2rv9C~f2u%e<~NmVLu%C`G_$9* z;uY{G@*q|{ogw@vUdZM+GF8qtmY9{q49QIl4|5X+IezS|jy8Et=#lois?tI@5gxIB zgtm9x*WlT@;LMBF*^sTz5Dsjj{)1J(4ZORx+0}kSP{bo^xSP)oJ6YT2K;j~8_+}{b zC@cFK23PymWMG33gB!ZP@eEm$w4=DhsboviFEvs|c zjn<4qMidVp51yQht6*K-a2OdN4x>~BDbCex z9m?@^@NhHcmgTBJB`76$$-^m_ zWzmk-##jPk4tg%p1Gf0M7Y6QJJo^!K?4^byD@F;5NEtOt!Z=X{XayVX`H|DQDW-dS zabcCe{8T(cIuPTL{nr$85To&ObTtV>-)xq^kV^LM2wl45hVd-dMz7Hb$#H0;1;IXV zW52fr&8Fzxf!YPw&u#-2v}X>?GyNc?a;yAzOs!fm1N0G18BBdFN&>_HMgU0uWu8!gpKpIkkg+QA~f*K z_85V}{2tlsy-c*EV8M4wA|+D(2wM@w-4SBWO)x+{E8Tg0gddEC(2;*A!l>yTS-wOo zVlXqg5OsRSUjUctX!!^gPI%EFU=v*lxh4LM;nduodfe>$a=Nr&>n20)zKBe;ZU z$GXb*Pd((pzJ=o3xjuiaM@B|=>__TLrFJ#9wN=(UJ^U1|Ck~G__v$3Bz2}U?ocjf( zp#y&3-=DbX#M<9yXm>D|C|fCQJGyd$Re^9WkH<34g=5SBf*4qL(A*(L?<$md#D!30m-eVmWyc(F2q&+!c? z(vFk1eRQF`+fr0mP{5AOUPg*ZpA4G(B&x~v46)fn?u0-*v5JIejKO8Nv!@q6qtLnN z0(f54KK9giMZR+*_y=Eplu^5(;A%`-UCQ+QG=v5dwW|EEAMb4sQW#R3Tr%D~8E9gq zbUvw87@sZOzb1iXimDuEU2+?!ER#lt0t+<0+s2>3AJo;*AR}SFC%O!pP^i;@XihEu z8JHv{Xbq01sZ12Bd3XpgJ>pkiO-Sim=@t9`1v|d6q^r-cBCy#mx36NQ+%Zy2$snJI zniRH%7t~tE0~+9?-c$-(;eLOtd7&0$QPt&Lo#+un^*ICM{imYAUMb$%p<=4B`Ox0nWVq|Ru>Mz@GJ}hS*i^)pDsXt|COZFIK|J|rPTT)nx_rO)*9X9-Z?1;zD;Luano(7w8)?$SX zLAmEZDwG3lin-_qt^*Oo>e!ap|IA@|IZcViLhW!Y=P%Bm-3+?*dfV&1#mY62%7Yl$ zSU<8u&N-+Za^o&4lXmvarpJKG>QQ}>)8Day%z*yoU^g7>O(Y53r%g>ZJ>&%$knH~) znu58@gjc9{%^1<1Zp`sE;@>wKKaGO}^WD-4wSobx5O<$NNOfa@opz{mnUk8qaGMj@ z<&e1?jc0#OM$Z`&hG|7$mq(r#bZwx1l8iYT>_t0y!V<{p7+p(e@;}5-*bKzc=N=qW z*^Xtq6}KN?U_wO3YC3UXq()?uaQ_}D2G(e6x!rMkfNGK^aYY+r)Xv&aKA;%>{y)>z zn4KACJBK`z*5%*Y6s`+Sbsh_Ya(MZ~PtL_xZc6!aHml#7F8)to%&Ex9a>H!)r> z@3$S5x8j)UqNRiI=_)QsPZu1Ck%WS_6J{{I-6x%cV+qE$74YrzaT=Vek2aVs43Wp; z=GevUGUD;Pc#{o-SA0J*Z0!ZHlI&HEDV(d^whdZEb0M_)vOE#6FwXJ3eIQ4d`NF;j z2#`n=KY_gSVD8h(q{d_RoU47Cc*Mf~^Ea(cjg0|Jtt`Rr1}Kg}h(`1^gER;1kgYK4 z6I+&GC=p>%)J;~_3so#h{x@q{D#~jwQAKYjo<+}_?a1~x7-n@MSIO=0sD2LpV@6_7 z;snm)$FIf(wbgGDbkzg*(cZYfBJ834snh>OXPMCVJ{F(N7qL)M5h(!P>Rp#4+;{yt zVu>sGdYHPc`e1&%y&`zO8Q?=i8J+v$YEi@;z%?o>=3is%;h9i>HRuASzHGHMM~F@p z@)IbAN^Ngv?rrCk2@2dSYyfAN)rXq{;nk!f+kpWyPvdV8Ze$2!r4+U{7iIlQlax1U zPHE`*ynHL!)5a321?;a-InBBJ1UVMx!eK)gXG~b<72R}yy+eKIp<_wIn1#!`4)oXd zdtj9euI@VBSNPJ!{9~1WRIPAUr@3R{lPOtrrsA7{km8)5NaMc(BzzA(tc`{LFSAL? zGw4tQbYN~fzdnDjHat4M8{V?KHV`s28rflH`LPQ91Vs`AfB}8$)lb{wn8j2pWWJ&bfFp6mhf(~VrUGlKDxA3I` z46VHhsI}2G3Mk%oVwFi05*t$K{S#577cUbC< zhK}lR8-yzS!LT^>+hpU{&rX^)w$Bgq8{86Co$rW45ft#vPQez0C=&v`!^V{T66mIN z=3WetANni%EhX>Q{h<6%nu@i%U_kc+=UmhwM3%3{8D*L?m1tM@W?4Kvu9cFsKHx(aGKRAc1 zBssN3QZsFK+QXdh6;Qfcf7#ldDPCIP5QA9^PJvaytQ*1pWoYPI?H`ZmLN;6U&p_6f?@0sbJb6c|VnkA@_@p=(h=L+*{7u-xiRGD0ey~-Aebq{JZ=$OaF*?Z1bRi;E;8=3C>n zT*$q4N>V;8)dK1(Xn>uD13OIu!p0zsgGlx*n9#9YR+BlzPp{#vh(nzTTh6nm!#*62 zdK%yLz{2EZm80E>TkqfBbU*s)Z^XoJ>J5YQ9UK_H}nIN4YW}h z`Xt<2@z&!YCMUsvy8FKz2=C|T%`R35O`QUfY#h}{+>9}@_cx8w$*$Q(uIAtGyczB6V6!9$$GInw5+$Uj+MjLL%vQ(sIbs> zmC`y*0|o2P4gX5XsZXLOa#=NV&+|b|SwicR8!EVbTk9})B&Ag>hu#BVg9X#NAOQTr zs{b?sd>^j3(4$tQyy{vAf7sx*jerp(a3?_a$Lh?&NFe9o)fm&>C(4n8R&u5?E}ufN zzZNMAsc}3j?ix@e?}{_ry|RLbe6BSwE(KFu4Tp#TMzX7e9l>*)AZ~O$&@j@_(o*9F za_OA|+~sx05VS|+j;2(sN(n?p)`RIb6rmAlwD8W8 zzSh_5|L04JVWs}kL)i(w-mYIe zq$P4EaUg#zGN1UJ-T{bcbM-l~2cJS+F6t%vU;cO?bK7?fn~oZXcbguS72yF9QUF8v zq0posUG^%6@m!n-0HvSdd1+(l9^pQlf1HTsZ&_4)8QmP z^*d8f&jkdoEyKcZ@eKd-_f{D&Pb^FdGBkXZjL+da*j0v_r9qh&!(~5PR z)mBaCFApZYCrU<7+!v*+2B_ZIW*yd^#_@8R$3{T-xFY|aJ5%Sw{;YuAH+GI$oy%tR z0&72|<%&`7#}dzByea;t$(v$|O-|W_o&fQx)E(EGxfkDXiumtGtjuj6JNO1}buOyV z{0`1M>4Gr0P)w`_1Q_ehFQ`juD!eQx@HBsMo+LDU-lxn=N+JECB)NJpvAe}7M%uFc zLH2RG6bQwYpA2RZDz13(;>zP9%1H^6>>icaYERzeik!kpy)@J!euwi2gnLrxy1!mL zYYc2SmLw*jIXYSH*MFf($keIgq``eaBr90{S@BKn1w8XcJKsPjMz(Ulf88qu;7-He z;+jDpkX-1;0BxF%{>_qf>;j1c?$r8{qNjKz5DHefL$gUXk+45=XUZ;tVXg}ZdnqO$ zvn%m15@W08x?~fnHb0C4nhF!qV*^tNMAuR244Om+<};u0uKW!tM=rd_^y{>w#fM_< zMLac5)~5Hv{dhs_w&TU#Z*MYWIXJ9%lH;Wrp<5_q`d zZ-#gQ?G}*FI}s5PL5Fs-Su*LyDY*~1K*DU!r4K%C-QXbcejqCk-iW$o1j!o>ADNVPh;Tjqr+{mXWe0_<(_~{ zuh!F7>w6&ve2%umscpKh?#1`XD=`qc(7n1Vr5CONQ?r30&S#P&MrxUO&18N-%*~a>_EiJPZhp*Md z2^?4CjAL@-I=(o`H*mBF!WslW1WzCKtJx)6S)y=Lc<}mYR#D(6FmVN&jK{AA%dAUz zL)C~s1gf#V4}^63zCci1>fy$ymtugj7meR#FZDOK8@9mMjEtzSWO$B#;7gDno%+O? zwAHoU+mSa&$*Hh)(yB5dH7>0x1v%T_+T*z|y2!g?<@@95CI5+G4f;|ZCGXXTa6Vb<6+pxt zFyJ{8@3?0gq$Xh${@OxH~)abSJ15-YA@4!Oc_QiBP`(E#MvvJ81dR>w+LXj~N{w%R}q z2Ni6j-M~w@B2GA3PEToC_2`D^`hQVd5M9JL>G+Gc?=DJOU>XLrGvNjRkvqb8PF#LL zLD?h4h*a?%HfG$%i}#pn#3)Cmj_j~mC9?K6I+{ft2}{j1Ffmy$fVg+2&c(%RE|MGD zYGWW9+vorKa0l}7oXW~dJ-nrZlhgNQh+8p>g^zrbcW8U#q@t``hr5PzVZMN&H+FU| zg@c!JP2EYE80|Pe);R}d03bdVw}N}W?PH2;Wk|^J{!%C?KDy<;sCMRF2nh(qXlxNN zD{<}rxW#Zd%IH00j1OZJoQL-59XWb*T>0XyZV`dV654`3n` z;tB1{-EiaB?k$opNBf9Nphp-NZ~N%%v8LMDl61VpWAF=on|PY*Y@=2r6e8$z|MGy_ zlDRUS1G2HsC8-B&n$jr=wD&#+{VDKBTYT_>nWmVUn$|y%wE)R=b*ScP#YH5N=Chla zaU7(IR|jvVo`X}h2mU_HBYE-sb6K0p&)YtlkhqSs7Gb+H&WTf+He#)&g{f05a9>8K zb#Ac<>x(i_J`QX%96o3#gv}&Fkjsaxyu6t-GpPlgl8EF-sS1uzszD3;$vR8{2xk7l z=g*y>er612OAhhmF{2+Qq++YT|2n#bSL%bzohdHx)gH8etets&KMvg3{VB+0fq78F z{nw@+sO|+iLgLo^&wTsq6V?1|yW+rU1HnIH)IixvegnHGBf;aW%_Nq$t7FkfAo#b- zto>@Tr;oGteeW2~3py!)7r>b*zv_o_PGk4(hbzxEoOlSEf#p|^?`W1Oi*$7Ajl*zl zuXhz+J+nG;gF@ryD4_hw`JcXQ%a=)6bQ@ zrBDtUOA@&ySKd!2QA=K&2o<_b*CiY6g$On4LjU)mf*V2}NhO~*Hj$ZUCtHXMuyxk! zW-&==B!1o~>RNqbf(xwICPjgZurri2Jogce`{zuqs;|Ih&`F7e`>7AwySjXLy>(&j ze+$(RK0qi@>WDrZkyK0F&0c7!l~xD;nun?ww=jyl zK1c4norJ6>HI1ZH1zRN42ej!c9dECMm`N3#VC~oL z`z!e>@cx)zo74|Od6L(8ujO?Nh_)Jri6Qj9-h|2y;}|y#JqaS;uqU@Ro_D=p{O6SI zTJq_WEu?Q*`7f@Y+HtIF+o!$Pf9&>tvhBY959XK0ZeP^m|J4#BwnJn)H!HJf<2DED z&-q47Oxj(S6ay9QT8laIg;jK#jn0MvV-PdHZR)2^Iiy;L4pWd$hDXDFbZ?$qdI@#@3 zV%`9SWb`zPF)yM9=+X3u=T-}U;;`mR~u@BWbF)$f@|K@1ywMr^F< zwXk#9Rt!v9<-++6hAz3YEC7TnJ0#LD+t=5}T}9efR_-9^yXDTk+XpQXMVf}!fguN<~cxLzkcoNLvOzoIUFQcIJeZch4vjhnQiVeo_qFB zHVsT_k=JKHphIj$q%tc``J4G72j*aXM@*ow46x{JGW)HZN*y-Vx<^~=%)3ATAwA(r z;zsky$lM3E`&+tFZ{6PD1X#qwR}e`dJuLwo@bmW{zF3QQiG+hut6^8_%27xQKWWf9 zzKoH=3X6Jp&virN*&KCKK7w2Da6DASd`1prQNV*d9*@gRY})8-ZAv2hzPr17fbZpY z_%Q2A&a?|5tWf+|>^?m*vkCOQ0oY!^DQmEfj%P_(=5rTe(nTBWG7Ypyof=I0{I+0U z(W8K0w!_{i6;@sm#0m#>aO4zXb=SVi;y^6%)ON}eerwcla(9rs0Sg(3=bpy(R*0P= z8`oxfxXEGglHG^rKtv=5$T@I`m@nEFY0H48tWs4$!`HJXRD2Nr!MVdgxb&<{JJHnK z+^)voG_!g$Gc%J5L68qN?1+a)Epv3NRin`a7GO&ylHsRmbEAviYXGpqNKaqMGo4FS z&Mi3p9gjIAgUMu;zP*k~L?IBO@sO()Z>)oXO{(hnfpdLd$1cg@7~*5u-c|4gLTYbs z@4ua(@5C%Q2v5p!P-5m!g18P#@@C6zHD*D@KIdc5wj#O7|rW<5+`kjh;M>9gKh!e=PUCj{)c0wTQ#87h= zM%wD=m&km2(ebz>#9_COKyyQ(Gb6So_AG}NRoMg`iFg($cYrptCwb7;9XdUWV~hj2$z?d9 zCU#*i!c$(Ofnfmv zoBmD39Uty+GNyQn|9KBHOc_)2NeG=!bxzg0X6p{0_tS|VUR90BU7@ooCv^K$SQ)irZ)uN1XG)3;zVDrPuISw~f(Z0vq3CalBPf*fr zq9^GzPGq5G2DPwL65e#|rpB;Pw->s;LX(Z?lo!2hQl%S#O0fykQCkg<8quN{Vv(nq z!tOieKK!rgS434xSyC8>>j_CSwtckA62@d0G6}qNaUlCfXE39vr3gNRb}aqw-QQTM zU;FsP%EaLfTshGC%yJxo7;(p>oi}6=%PnrW_0Vw=sgHm;8dKMTFi-`W7b}JfAZa(f z$hE(<8C4A7mJT&ILg(3e1e#Inw;UE9&$}p~i8OD7ck3@jl?!FY@)p_j-|S5WIxLeM zj`KAU`JTGo6W|#lnVF$1m-6moBBwhkLJcB~F`L}Dt(f?XGIkvmO~HD|NCPdSSL*^< zv5JG!|6RJlABb*}fW61Ud}Kkh^$Hl0j}&WFp_@C&*U2mzm=ofFL%tb5rO3FQxK@!NzLm3BTBP R*WQ^75((rJ6+cJ)<3D>ZgMI)2 literal 43257 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

G+xNOj@*u)T5?lZ?zCZ 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 diff --git a/travailleR_files/figure-html/unnamed-chunk-17-1.png b/travailleR_files/figure-html/unnamed-chunk-17-1.png index 3283576eda7473e92312802c028c8342472dc36b..d3e9db6edd0643c2b64b60efc6533e3c21438050 100644 GIT binary patch literal 42633 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 C_EyLM literal 41218 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 yv(zMe+D7OQ?iE$`g5JO2&u*HnD~ diff --git a/travailleR_files/figure-html/unnamed-chunk-17-2.png b/travailleR_files/figure-html/unnamed-chunk-17-2.png index ade15260a6075293902d42cd81a2af072ca12871..c2258a9e8acd1f7960334650f5485181ef1927ba 100644 GIT binary patch literal 31223 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 F{s-Gc8NUDk literal 28563 zcmeEud011|+V2LnVl|?r6`5;2N_$j5ky(hXRcaA%APIwE5CxG*gfN=Hs#pg=i!z7| ziZUdSgjoV1u~AVOMK^?5L`64*fDi(KBzNuTnZEnod+u}px%ZEg=dm<YJfTHH0t86PFUBQZ*u7a^O;oU-9v zP*=_JKmYm93jF`R0<`tz{sT+e7cmaeQ|ZI>Y`7m5!J%*|oKuTiicbFIxmKpPXaC_+ z{dYY?ZW)JdOEG+;lJAm7L9m5^!}N}qlGi7?N|vMDX}gauTNt}_fY`-;LuT2-2@EOD z3YS|t&PWb&|B4zf2zeekqcU(c zt&7PC>LF+s-{tr7)>YP**~Xpq&+cD!hw0|p^U57Ch|XK8S9D@9#2xJcP3R= zJ4LCOGjH84X!ld~#qTaYUW8tCuQA=eIL*#jKl0uX|1ap3SKk(_cw>EE@A1rSt)v)4 zNIClHe%~LK?F<~ImvKviT*9c&DZ{GwZEn%QICT=}n;5B`HmzsrO;VlFYlps8trGhH zw*SP*+JoE%PEq_m!5=gJjC|dI-^W9&%|1Ltnvn(M20Tt4=S5Y&Rn0}eFBv&cj?mx? zj2?5YxNeBf#`mBPQGQ@_xdV&Y5HYg>?Z-c|?ea-VGOM+;Rj;=~*X81%g@fWEB18IN zFWo=eyaI@-_dxH4*h@0iY^jcv%s@!^sNqyVXa z$?#T;(`(o8j4ko46n`!+{xqqp0KWpgh5dyi!6-cAL7c1PH}Jwm76ZJBq3g3wp4rP} zGmC|27yg=)Kkhmn=TG|hMWb!qx}S-~Ih7B}&=$yY%mQqfmFxBa>6Kx*;^$%2#7cUN z_0*e+SDJE^)&nhCNvfrGdTRJb#pLS53=SUS5;4g|0_;#A%i~SU!j?OcptATpQd;xhpG<(?-W&?{skIMi1=X{8zR2 zA&22rG;h2;*Kg+Cp8Dgt5!x*SnYk>+z_v!!0#z|7{y(=SbK$ruc z{B?m@HfT&AWyDzNuZbd&nnIkGfUdMh8=>r6JBC$K7d|Flg0*b9GQ=|Kop&}{gAT(_ zlsDpCb8?aR-hDju#b}R)zn)!|@k!K*UFgZd8OP#cNC_k_!NtjhcliES<%v2BM`yFn zLyS~L-Nv=c(Z>jXQ(2L|p}=3qnFGSB(?-~oBgWC8f-chA`sL`9g|C~TV?(z(PyR8# zCoP$GA3poXnrqP4pv5`OnU5DiH;behRWkFW8z}({n_0;(wBW6**Ibcvah{{V7HMKHI=D`q7AlX0Il52 zfK7Q=)^GnjHYP>1C;bK3 zVSe1zrC)pbz|#?EU1TA<6p- zb`xo*?DSgu?vux2aHN-4kh5naG`?Csd?nF%bl{cvE-85`5BW%b9RKF)M=crX>eDlig| z1VT-7wHp}GJyz4OH^pd(oG_1_y~?F+afNKLG5By@Q_$!e*=JGR2pSucMA=%M>dj|1 zOn}S$ZS(Cyhj9&YZ(Wo^pt=r4IV3X;J;+{?7EB@E=wjq!R0*sr8INat@KT>)`#}7l zx9G!@nUza~Gtsyvvf%_>@5|ntL`5ClDn;&7 zb&>SI(|SqH`BSGQXBxK8_9<<{G5*VTg3i98hI_ILiCy`op%Un|JbOPkY)o2=GzA_s z(7y#;KVOzFYr^kpHFaYZQ-VUo{Uc@ln8F7}m(WeNeD@yt4H+aTOZ`%K3RSSKb$NTkD!%B_ROz~&WAHO}B*?atV?LAr)}c`L^ywybh$ecw+JBzl7&|ziNU=U@3i&pDMQeR5P7(3w zl-on>d_kNugBK$IiE#$3f8p zt+d2#up2QwoKB#+W#16%L6ClNR%3K&??I8|oB4iCi2tMh3pTa=nHqCfoI7dWcD$F4 z+7;Ap0hJ$*A{0s5|ryyd)l?0ZVz+e z%;5TwT&sm~*$0G@<)#hkUjnijeNd8-JeK_?RZsmT_ISoOoZnIXZ*CHAUoeqb8Bko? zE)a5c=9R3h!{Cl9(AR6O0{vSOyV$@Rty}GP&V34~fDpNp5gH);t(e7l zZO%Pe-3jSoAR^F4zc0Rr*xB~X_)wCULcHJxA7G z*7mC;)ttE+g6PcSv*hVNLD!OO=xbVBg111qJGZpqgBdv&C(@axj&AG%ZggIY=E7h1 z3v_lK=UQY4pVW9($cVvF`&Ut*rlE&O;Nz5B4>{~7Q@W4>Bo(kJVNf`+9Q7FbS9S72 zEHpzjEFF50gI#16kD`Od0xd@}IR({kNx2Ya-zIFo{waN$mtu@Sd8vB0nJ$U~T zu;Z<>bMy2Xi*vUN34?ff3>=OdgeQzzM*@5{n%y=|5>ah`OHecn1wPWeBIN}lcYyb3 zSr09#W@yoQMXhv2^-$$V&3IQ}poEMu-i@t_cb2p<`YSeRWe5q$qNT|b4VvRISb!qF z-TYy3HN#2o&o(JOWzwa$*Ao3)>&ZY8biE;_#5Yi!W{BBseL?eUJarxSqG+-FAmF)OKv8< z6$elDAaXbe*0L%#@tu-C5>kAEbC<*)CMjko^^92>Kr-Ca_xsw#F9;RgtNSVr%I7H3 zMVCjOA?6rmGA|}cx^S3uL^6|nS_~x9w{>wIKYIFA8Fv!6v0mka3u8+{j>TAp96KP% zf@_TKh?9{I zR8OL%qB{jgwdmajUgQUjoo7VvcljsWb?W8?gldvtKJe}BYb$!tR}Epkh__B`&@!A=~vQ0(qX~6 z6)}VwtIf6Csvh$i#5dtSOLle=wK8eH1GLe~%)t@evZFH^5_Da10g&Jztu0$Hpc(Qd zyD*p^+7mE_F^W?s{`$m6y5<2@y_2(!gR7k%KXlgUhnfvdv7L)^TfpFiYx#wuHp666nj;BO7w zo~?2Bvf5Ul){a)Sbvg~ z0Ovs&Ggz`$c?*+_;%>;v8Q@@7{oWXt?E^Ufgn>^nA^#xi!!G*QCES@DH|$L^DMZ(b zb`JzGN&kHu?=SvC(sc9Pn;C79l?nRblaP9QckCmf_kMWLd1h_jjK3?f4s!vwR<9YZOQT*msGdQZU_rh+7*E1SK&uAAK6+ z)f$9ZsuTKV@vL?Y$MyYpr@q_)uJU`Vmr&FLXsxX}FbU%{AniHCt%>&`9g=h-4G373 z$wI5FxZ*NO*+SO0@);>sf0>cGnHIH{Bzq3a?ettO^6tW!dEu<+ zecm75nST~T5cc^UZl5^H{V(*+|6%;41;jzCaV8rOIIu9s>N(J1ur}8h=T$_!7LMl} zudi#2&Tskv5HjRjjM6%ZW#soi4`MQI zWBzjtzD{>$rG14hZ{1jZe*BDe>oIs~z(IR-Jigypk+*y4zLS7nO6zD7RAGDsH$D>= zm+S7VbF4i%aDMYPpqhdAfFZlm+Qp2#q6+VmKG7lkdvlMS!W3V1xRXyaPch(Vn{L(e?x@4$le zf{(8*Hlo*Prt6?=-co#_n=!7@qPe`jj>F}Y4n3T;k7R^RbRuP#!k6JMyWFHK2kZlP z^dbB;pGhU^>v=#bVG79xXk`EHYjhuIRS{qASUysjnA)eQ9dC%lM=+Ld*z%n!6y)~+ zWbFIz$->%^*GQ0xF04C_4oDN&0J?D35vq!3>TD={_aE!?|AX~W#ljH3<0}B8!N~kzJB+?ZX|Wx5ddij!Q%-6qp zqxY~e;0a#2EbndN@6hkQb*pHt170IU^a~WC4YYs09R<^1e9@nVc@;4P(tQ2pPv3V! zwh0OJ)OSR5dQiyHG`>oA{{8Fy+xP!ZhyO!C`L_#&O43e1e5=?0w85w z7mp_$Aocjk#)}6Ib2%V57ICcXRKhebC@Lt32bq0#%N2F|NCJc6+O z&G*`^bys%>eDVI@B{u%|w(1inZp+~O#|i#FbAl?RcJ^JSa{TN{U`+n*?ap-ogiWZi zxV4rS7zV3MiaG!njooks{WAT<$`>)Nl6MFUgPce!Y6C{4d}J@2PuJ3I?VBA<6kHHz z`4ge#;>tv$0#um#kRSJ6e&3VG8b$+Y@W$1VrzKACh}}f+xGN5O&;YPveptfx9ag5d zV%A-5UeVrdlh0ue5ev98ZsO7bLcbfidMLZ#e+|Xc9(K7Aa6Wbv#UKcBLw=NAMSAHK zbgEajkK7eDs4&&?-D*H2*RLz%6~_Na3J9h;1_cTk(aerW+N`f2#$+H{u#ycD!pPKx?GGv1cW67hym@)e&vuD-V8?pUnQ;}kc47r1V zL|jiwY4Qo-@i?%j{aOrjJ(t{sV~nL5rEcl1)eBFpmw>Dy%_IJlV6@#8Ur6Bfo%}@% zI6PMZwv&Bns$tSr;&kC$Cd&UGbCmqKa$(WTFRb*W;m`Q2qOu~M0GR(?FLEf^nY33z z-5%m0RgevPd&M7ZUM`>iidKHLfg{WB)IRM^BoB`{5l7aL2KWGn(1$3D;g zxC{q7Iss4ZIJve%5skz4nQc+d8<(OAu|K`^eTHcv-<7|jy>!UKKjDz%exf~A zT62(FA>$;jn$Ad+{{)7kolS@oEE5CK>M(ooe*ZW@9=$8zV-_4}S!GMx5OH58FWkV0 z`b@WRzMxDg4rMdr%+Q#R<}v>m83&mPR*~V!s}xPeGHna&IH3Fp3ORW^L9116+`Vqqa%l#z8+^PP7dsbdS49aEvmdEsCn9NFeHr5-(;( z6Gq&49`dF|)4d*mg%u@c-oYvTv`&EGeIx5b29`{0FvM05zA*E+SUUU|=>Qq-l74eW zIzBu^STl8Uo}~X|L^?W^n&tJeU@N*4!emO`oEY=r)RqoXu;dLG3=Q=ki^rvNa{3`U zE5u!)c#mv_{TW)C+a5E?4h@x@qpx+r)(dy=wu;q#AKY@|-j}sanVfr6lLJk^ZK323 z8{M27tmz&vcG&7I7K+RKSDtDc1SBB0JYMcgXe<)!gsyXD{L=&>4N}U;i;48C7Ph;7s&SV$x{`J@Zf7k<_K0f zH)Wz$U7r=+P&+8^m!}*$BZ<`b3N$u9u{tfVYOY&6Q&wKy5n9vV`P4Xfhxnkd(b3`K zwYYTtA1V*Vf9F*keOf7{D(gpSyUPOymaz3ZwP+4^dbX0*Esc10MS+%P2=|%N6(8y^ zXFT~ZY{3ZeH8-&EmR9Ne_2wY?ut6l#|H}kA)lU4KFI96b%VV(VNG)*OZJS1jfQN-f zKW1TAqldkwWJ71EqwYHi+fVzbJbuWt4HGeLb)JKEJ7X;Bhs#%p4N)E5mJltOfd@^EIYt%${E;hg_7Hor6>u8-P`67>Cu{j2N6-yk+pjNlegZm+9<#EPXSHvz!{*;Ldhr64M zW~<50HAF32fH7wfY?#RDRSdxjZ)GvIPSwFI6Ff+4&CeBuY3yWqQ_*Qa(2LBEU(fn9 z2aTg&_-nQugJh9fp9nm*->A*v4^uGrkoKun($-vpZf zHh%bDcCd|4ZNygF`qd{h$4keH#!DP{PpMYuo3dM+4QPg5_P1p@AanX~*EFz`FqE-`xhU)rSAwr8ip z=_76_$2Dxbjs!|>z~=OtnMdY7Q4x*Dei5J61+8yreM-QKk6RQiR86)OOk70>GdlCb zaIIESOXojo9B%b_iI|kzem3&~v*k#kSGM1?kE>L%d`S{OSaw|zZ7jSoL7PzH?A59S z2?1q@hC7v#sz4nTA=c@UIoGuojhZ=Him;ozeoRmZk>!lmI2PH-ZnJ#1lj|tu5HOslf6OO z=)?;jY8bL1q!#8CDPC-R34|ad`4A&K)TSEd_(*W@1%`bj^VpX$gzzE-1q5;YZMHR@ z-6Me4PC}OIrPZ; z{}=CTK}C-p1Kfweog#xzHb)76UbuB6Cc72q22XwDAuYI%#{EIti&EtqQ#(Q6|HIKtm7kAXDq4K9gqx1?Xz6Mgt@em{P16$C`Q0f>+FPDtq_7xGxt*>ESGIZ+S%`*S_n7 zcn_1{?5;VXEQ=Y5NE;+&i+!?Pe$rUC^IJdTD`%d3wQAMkZ#-69{_b*#fOPfB@RQwN zJ04xjTy#l|tG@oXFTXcizish>#aA|e`PVF3yfH0A{kO$?Y0$b&YPNe#r745Oj<}e3 z8zPBLDRi;VO=%QQ+LKzvQjsgEi#7VPu32aJ7pKT*%6$IETdJYd~n!Fb}a z&Xs|=%OH2FMyq|tK+>VXHafRUvvT=D%D$YzL)o01CEK*e)HR`yW4WPoT$W%cV?34& zd8HFy1^T9~-)YKH>=IZNHWIMj+@kmdl6TV!5sQ$$zn=>@_O_=}rs1)>fSJCGRO1SB z5UFD74V}S6%9~6^&uO_FpPv!=rwbk?8`#;3>!+UW)PXvWr>Px>bKQ&yZLH+t919yf zCkopIQo)aOx_~f7eyFbDii8{ZeRX5yO=%$6>YnPcG!JK5q~L&rY~!w5bqtv)Y*fkV z2V}1Ai@5pTL5JvNVDlfxFV4d$-TI4d@5TQj;lc*=dRfwPz8iUj1P=x|V}l68Bi1#EWMUy{zP<1SUvD;ncd} zWILv)wb+?-0F!4~8q&irm|;`V5RvBrDp-nP-p#s+Qt zwITjH%O+@g1k@__!;yM>exn2?$`?WWfEX6?u}moGpYfhj6C&%b5ISmzk`r|^78K*d6+$OmUsnsd;;&^92EtnzdE)gCTq266Ux zWxopIck=M^T@q8wA+v(X3iA?G@<;eOK!+B_@V?&`If%6>_*^0o5Ri80mC+v(6iPre zn{7?2^RV_oyaV=SGIvs(;HOg6&g+Gxsl6v}6n%gj1BGa@62zxBpZap4gDF<-5ICri z06rA-u}O{YT`{jBGu^AeLWkd~jLGuLRXv1(?v({x!>FJKx3GQCYcyQuF(`hwgpX9i zjtrw;SE)$dE63C7_`C{RI)~07N@7w+cn7k5i1xdUq__M&r8w4Dfk!DYYVRAuwtoT& zmM_5)JM~aM(ZXhzz}QwfeyTyBV9O@wtEwryQ`I8@DBun>2Yh_}N&_(MuB`jx)k|Y3 zRbdIACB2~HCjaC08D8)FnVgYVz-|(UK%j1)p{kx7wBX*Ax^YTrfPUcvF_cC7pFx&bGUfEzq4zJsni?Ln1s z;~t+n9et1N!K*?a5Bq$-mY1SK-qfE-CnO7Lj=w3$RiW>0FtO{=IxeWdfARZUwe%sQ zqZZN3p`Mmk*D$$*>2y728S91aPcQA^55Z%>D^$xv`v7VRU;SRT{P@}>Hlkmiv>*|i zdMk@^FZE#>#gpw*lE;fQRriOJ_Cyv-7L=)!NbNWysBrOmS^W(dLjc} z4tg1j?l^9H1Jz^q4jmVO8zFFbvegme#)9hp=Nb_REhRA znoO9pdsgSoPbsTs>uOn@JX{--!j1n~;4&dD@%AB?$W941?kC{u^!9Xxg=_3^J-*gn zHi2NP>O&ql(Ott|0*e7YUXS*K*GE=h6jPl|)kx-+l!3!dlXsZ4iys8|Ek;oZKk5pU zeFhHsE$YWzP)$!z-wVzGNdhK+z4n6~WC{EOoJHtvT*^prb8S1NQg612;?CP^zw-vi zqAh(+O(EZGQd~)IyRVFkI8BO|)FTEMyGN#_`J6(($Ra6@cgVi{ZT6s*-9PsHcf-TP zjsd;-g`EtaL(`tHoL*BI1I0?K);#M|#VXJ~N62;&1G9P1qyMg-bCbEA9BJOd7}*~3N0jyLkwAKG_;5_R z5zwRM3>N7&eiaujgByj&{oRK303JMI~Ev2<~00ta)5+T z%{e5=)5LFMpN=PfJFA6RA83l|9Km?|;-`fcB{w*4fXe9>JPp4$u@>Fkj6;r=SFZLS zA_85rz1QRLR^sSZh;IvzJFzfG=ne4xATvkFG04}pfL{@`qkQPH#Ho~A`r^OUFW=|U zYjX)HUeCQNA2&F3f7F(zb_%u8VK!HKFx6yErCavPqXo90kVOA-<d}*xC-tu{ebE2_`SvBTwX7ukdVS^D6DeTGwQ7cD8b8Zq$Q81Wh~MT zXz$t%N+VCU9a;Roj&6q=%=pm<9gux{y!)fcTh?(6)0EJ-nvd)0dIU|ng87#CTUjuSMGTo4WPRI`Ijs9r6A|Fh zxE5E7h4tR<#K7FHus*Y2Pr8zFbzti>uNwUoxx{StGfFbUyY>#Nx9!e-%s*tKbw}}# z(VM`PQ=EIxuetWN1!EoJL~nyPg_`VOynS`bRgw%i8WYTVpOnxH8L!mu?$`lL@CD#V zOX6|6?$<}jFI!bFWd1`R0tW^rG*8{HOBg(Qs()~Nq-xaJdw#m-*R18e^uX#E4NlMS z?$Ci_YK!yGm3Xn5)|%O*tN0PG)hsGD!9EElFsqAfripNtCvjr#OrqqVmHDUibkyQJ zbF(JmtMtQ#oY!WpK0O`_!n5_&3C`cNq(?Fwt*%_>I+A#M6HW+BCLNty=TAxI02z<~ zD!`UoscMNKVIL6ThMM?T32kL~)Szgi2rC+?%5v%1ouSTSH8EnGKZQ;P`T)Nb%6V zfa0xuN|t%d^(Y5^|I_Np0hn6a@Iql_Z5#KD!n}F7Lg!P#Vgab8JY-d*xbq>}V$dVI zEY~5;o4Q-@q+|EV(*ni*QRTUwgf7I$-XO-<08_`Sta>&8#j z4vzxAT(}kg(+d&Ai#j~;QRC@ul80c#R+Kzr8a5{$nVF9xs?ZO67L~10i=AR0ZuFx@ z<$imXpVh2UkkCLeqPOP)CE-*ni6JFOGa|N3z0pdYS#u~yIhLlRDDIZl#R1w5n2;oY zPs0zh*Ee=9ChfPEq@ zdEH~@%#;sj;0vcj-kCcUC8-fn*B70&spTB~rmJPsKPy=aDLK26zw$Ar_2ahKfPt=r#x%XGaPkh})9AN*@ zk)*5s(h8r>RMoOVY%^31{X3Wezl^82^hleF(pp}<2D<8F^w>h%VsTMQDCtLY^!Xt_ zRIJ#kJlUaek?;lg$6q2;S3~9V6{9K*tiBJd_6VM87Prs^d(n-Gm{qxvHMklkr9zgD zWFUv&x`5BI`6C0HVFl$jhe+ZfeyRCL6FfpUfSu`fmC~@u!4kv$qMH#am<*X$apU*w z%BT&zG~5qg%y)aX)}doUOqmg?lF!Yx6@Vmy$7%%+Hy83vyK(ZAMCW)=i=QBPXTOO| zkN1<J$~OA zRm738oS~x@ulOq~>#=iJvC3EYF86f48aIp-d8m#tfz%*l*-mWrvr%+`Aj_90errx> zu2)3?G?K5@U(l<*exJ*l&wq|t*8Huk`R^$HKOO!r7pn7`zxK|q;xM=D{luDe*9Q&| z4-yX(-9(0;&h!Z%F3uaaE{#7z+C%DC*V<3y)`1%3G~}b?bM+_5h3?=k@(@hcBSlFj zrxSsE#oe-xUWZO6a=ZkTBrfyUF3;3a<3xlJ$>n~}=Ktsi0L|4++btb$$H>(@~A$cS#kG9 z+ceM^j`m@#+OvYmCyAz=rZ}s^{yv2k=ZX^OFS>+XYyaVu`5=C0@7@u%JK?$RyzFR` z&$O$j|0nd)zBo^BxFL1smX1W)xi^8QBT)(O^1TpeD~L;CT8elEsnMk`KGpc$UbfTf zaV;>K0DL{%JAeM4d#4qY@a}ex^(p$upJI-gUEmoC-wuaz*%b0Q;y|9JrubAn=Af_W zt9lxUF>-cLR3S!DYteXz**&@NM1nx$`FeW3Zs$t-d-3kOgmE4c^HhrWL2~>qx@vyb z=R#p~hP}D9_sfuij+CMGm|Q`(ze=mjMp{oiIgn!(y)G+rb)H@zC}m4rogMCd%*d!@ z{D3{V!w4Px0{hmN#j%PZA3`2S`7W`V;rZJCgR2A_U2kb&d=b`mh9$#(@LrO*Cr$d&l+3?l; z9e!g!S(>lkY1LZFaJAeQ=TlxMi zM!Y|{q!pacW0m9_$UYdF`%$)@euyzrv*W92F(cHR6(#>i4AQ;buzTW>>>iRBJT_XH zxQgUTlIhOtel8=nRd3g^J~F0W{d;5SaZ?~Qxgm3x6?=onR6P8eo4wy&y!p3U01F@- z{{^5M9+sc3Sk~;CS=rc}r=m`*zgK(z`2N4*aaX)%c0{gm^L;Gj&IrZmt@gG-m54v4 zfr{Jz48!}_?;ciWSsFBpw_j10KU*PFr&WOn@;b5_Gss9OZtx)A2PaH;o{C57!R{?( zS0>D7Wwo@5c-Rl(n!xt1Jr&Eof~H;>t_LOI?<1ZqhI}t; z(aMW=Fu0D_>+@~%IZgsi&qm9ATL(MY-R=KC+5+7>PF=iM|E65@+@62JzNUP8<%=I% zd%d~GPmR|w?3h##rLncuzR!9F!e^1eZ_Jt40~MLSV!uH9+ZOnF&gUT7h1OIrNzc={ zaGyq?PQKK|c_F`o%KKt?Nv=`Rc*Ep|Hc&D^+iG7uG~aG~lM>0(Vr<&jC9fmV!Pd>7 z(Qfpa!PpVYlJ(K2Nh!#`Dgb6Qgb}B_tBpL>I>PR?Pi*}gR+a1wdPZB-2^=TZh=Gqc)knN!dM(mi2nvHJY7TCK_$5e$H$mGqo)61aC z<88$lG522a1>A+Q%Afc8Hj*5 zl`z(dWW&-Fya5EQRkPLFLkqjY(2c&j1bWw)gCwO6uK_IbC_x)<6ucG#9Dm3u_4cF) zF5&<)7^#FE%0EI10IT}S2{kM!YMj5xERwjN7oGm6uRk=DS>_p&8*g)3t!( z1s~yGfms)m0Y{8}yv{>W!}2DfiV5Q5{V?rG(w4Emsx(;dCx|l{O)$RlxdwB|-%Q)z z@^+h5U=m`p!8U*o|Ig1gsLTIfcCbA)20-+lC^tzFvKrV2)e15P+_{V%b59bOW{9m( z(Cm*N$I6zg`8L&2CEbZ)r=_+7KK;=p>S~biW9x}nAKAIG<=xFFTC2WePUi(_SYf^7 z2Z1VB!kV}?M#F*rIvEz`KK?-q-QLH*-#(5OBS@myu}#c(QYW%xm!HP@Fv1$vfs87D z+xne;T3~I=3PfOtS7G=>=AEq9(x%;YHMEr`qRjkWgGA;xPif; zgNl&YY;d%eCI{g&4MdYbGyGC#U^w{)mQ9Txw>=b2VLBcFD=$L>bFZhxsWV2JAi|$= zwSVscF01$}ucsuy-(QI9w=xz@nwNl`7D9l<^xZVqbC(PIdB-%7nZR*cE(5#CzOf*< zOMc>axZ;$kjcP5t2p+QV>DgJj(UH{CFIXdU?~xfyK2{lqP7Uh32&zPczd8`O1-9ku zR&XDzYvqw8&z=sC;0dKZz*zC)(QKwyiz!ZdFdHw=MJ`AqTW64qm_q~M`?*!Jvq|98 zAe524z7e$uXNjKnMe$AmU)RxHablK9ahRul9%t^&0+vN7|KuI@Upj&#ji^iKr^SRw zN)p>6+bGGVZh=Q1gI`1#wqXo$KWIHRIcjbWY>klKKm^q~g|MkxOfi!{&X4zze0=H; zhSCCY(+ZI5J=lMnLm~M|h7cBG)1H#$?pQ09x4Zly#e04TNoNd(3K!mc>A9o&l9lnp zM01uFgWzV@tNdEn#PBI*THw#{IrkkUaN_*wn0cNuJ()@mvvkP>f)-K0Z=b&O5Sva4d+4zMENHjcytbv0thhEpR?ATha$t7N6feK`=P|aHOM5{G{Ey@%uI4 z#7m3De&M;r;8rWE(_0!?oCHY^vsP<54!*3nhnkIz8~5=4dUKTH859tlK zJLJo<7Tt>Jdz`)kloM=(&O84CJ=<|VQqVP2Lr<@ke$QgzbA!ZY)4lMNaf&G;xqtSL zGdgiW2^VgPPh@<>!%B-BYTD*f`e>j`#TN*LB{+UM^{P3MC7@y zOXF#69$g4c5_PPJH)|dAESSQ6t2A$5qvo8i_)N+}Yab*Lb|_rogq0BrF~Kw>uJC=( zE-hb$zD*F;i%fnN43K%oj)s9|^w?(S4R9RrQgUWxE>jWmEI5Zi4*VE951K4{a&S33 zQC=W$C6SKMmm#~I*7F-Wrq@0B2BY`w4d<)A=Dij{;a>f|&w|Iji3uNP%g<&56WeSA zj_7?uvCeD=Mhx5-J+y|cra1Lz*oZZ7I6IaW8BXBxWaHnoIoE}N_|nWcdB^k* z(DIRmy$LvpR%)Ybkn)fhDAKCr1WQ^F4jea1{FWW&O_VoZN-;VhKPfSWm(rc+S$NG7 z!|s7##dwM0gg?M0kZ*1(?FCB*sBFb|P`28kS7%D!cOcD)`={dIU3vx8 z4)vT}yLQI=2?C6%-u-p)IDu8RvS-?^anaO=3XF8V8~n>zskoffhR1e(lsy0nb8_b% z+BVZ_9JOyk5{r}EK|1H_DP4&YZ2BIWyenzTYWKjJ;(^XHj^yzY@8_%j0Iq%QmCvGX zQ@(EYuukmhV!zP#<%AtI`LYk!PAu*m%%%r|BA&?^B!!;K3bQ%l3_<(V_Y1*6r{;X4 z5{Evsp5S9^K{-M;#_j>|#QZ&=b{P$-AhU8uLO6XKA38Wv3r~Q+VrqD?0~*&&qm$b@$D8UljEP@Lkn+E>zanO}&Ln z=`~{`_4Xilkbtk-*k*r+^C(^$1q02AsO(cHkA`396*L$%Utk25&d!zrVFiuu+TbAT zCeHj_d!DTQdRIN06aR5`>%X+M-j%-szM@d}?9JrUiY;jP~wa^&~l7)NW`eaE4M$ga4lil$1NxTe6`G1y32pMyp{3B z7W}{q@8!pvysYkIL}v~QAdPURu|~Ii_UuO3O@aSm0(rZy2Gj7u_)%+&Cg8b|bcEPLd$we-q zvucq+KQ|86)L&}~II{Trsn=VHk#}Db^nOZFdT_Zz=_@w*@Hm{7wU5;GUf;k-WvP$R zFmmG+=-7+cqXO;G|0c!x?rG#ritdM26^ zE**gct{X9Kf!oJ6laG)>1R9m07$+@#m>vE82UtKSSd^^e{5@H+%{Aiov*rax8I|FTFoK*SI6g+UZvYPA@h`3{ zMfo~Ner9oANy{=^O8m?G$IM0V1~#N0?noGz%AxBe6T!P@rGg{cp^PwmcApvYu?bGs z4Syzz)ZOzmH1|gzES?-LN!FQO!l>H*)!f6x527yHC$+tFbNW&O)jDpxV3eTi^)xdu z$0mB2nbbj2?7C%19@wLy2gqf5?wm&D|1>5yDZRSGwNec!wT96+7DH?tCp?O_X*kAN3&tlkkSElG5~KES!Q zq)Snv-CUn5J%^pw(Se2hMJM}a4Owy``AZH4U!25GN?Yp=Vru)#2=>6 znQ!#Pw9lRF+G{5YTWge4iM_wFihrUn-_LXIfu-!Gu@lJ<$Gr!VO|9^zl_wQlj2L`M z&gs+pB(Ei#PbNmYQPDihHe>IZa!_joO17q2?O59Nua@|y1B|&5oOjoBS|6clA&Y#9 z18nE${^cc)S$Iu@y5Diu$4==#+Y7rgXJ?-v+FkeVNXqj4u5XHb2eT*=;Rg1fH4T!| zhM6iBsmW`gJU`hMY1d}21J}aAKtNn?0dYND?k8#sCJg4hUdT5t&DF@zR^F5KTDFzz zwiPpLUQb#P>SyjF-f%8X$$mZ8i^tllh04z}rjcv-+7`tfBy@e(p99fWAzv&5 zSfZGrYv~zxLXwBnF-B{4c#c=6c40fu#N6>d@iq3Q|I&4w{L2VogEZs5-oP7x5{5WPFog|M;227FVYK`mjf#11tn}pW294kJiJk9 zv_;6DAF+DTX9v4LjL*P^#J#wS^}e9%$B6ZnoOwE2XEipXs7`#IV{zrb5$ki}OY=jp?Q`sl2uWpA+6N@zL@F5Bdw5X1M(OTVg4)5K$6n7t16 z5}4{3HoTTNjzub36Z^;eV^HY^zbR(*I2dq)o^TS~%W@x;=TAycJURWv()a#vqbp6B zIoM%czfH1S@Y^mil{-F0QXLM+_mjH!d<_5^)C_7h^a*&M9DU{ewqQq}scCw{|LE>Y zqngT=b%5s5$P?NI1Qn!}L1_h1L5dj%PKtP5Nltyf2(0~jg1P2@v zW@IJ=WirfzAs|B(Fp)7$fP|2c^LDuJt#{Y^asT#P@BB#C+B;`g?K)L;YS;dDW!S)+ zhjfnr$$RDn&1UDZm;B^e5iM-jF_S3&RT5451yW|2-AGe(aid2Wx?Gu@Oqvz6AH04p z{1OF)4FYgG5FPxS^UGnj+wfmT>osL^w{0f%^w2*uvnW$e3PL*>u~{g-++iT8bQRr; z&f1OxVNa9J()6s&CfE*~I7X#Uo9@irpmvh_oC72VBEZ4(_IZ zcdLrKnHc;D3$T~GpgJ=1ny`rlg~8-HH@B4k-PYQ%Q+FQa-W))P{WhA_lN){qL@-y8 zfX#B28OsFNn??A-XBu~5v|T@5xpA%a5ch*hWAOYDKu)|YH^@WLxCB8hVOPEUuyuF} zO3Ysls94mtyfS;rQ{}zU*xNdOm0rZ+H7A>X6y7H)%+0Zm{7){}+>l|2t7x2(nLcdUKhieINpvZ!Ci%zf>isu`3dJxna>+)!}I z6lhcxr-59S{I!VHk+KKFT~)~_n9Bf_R_3W9ArlOOBSCC_nKl_Ljf)-Xr_kcvBLYLOh*Bj6-S7+%{vj9y!v5p2-H0E zO|0w5IZ)MHsJMOn>lg%JaR3QcSGexDT87Zz1*{8z_AGmR7C;|o`)LG6_qUA>*fP`l z^|yBg0aq4rSqda9M47I?BEQ>?z}d-z!wjBiy2K9tRXZDH1L=IVI8aQU@(^az{nl(i zHNbO%$c?qTSHs@2Gc}%5G>HmD$Dzjp6Bb>kBp0I^_ThOBR|F@nPZjgy2O8TMHtWY# zdGM}8UpC}&^p9MbdR_z)Zr)0m5he0VGkA~{9T$F9Lm_K&lQ3~twXp4LH9(1Yl0uza zqmN5`#}QnYiSbWEqoSeUu+p~%c5avnr=1g57v|Q}=q1FUVAaYGdvll~h9lXtHL|2Q zXxu=s0)G#379@YGC@QzKc+1#CO5m-L0J- z^V#oY)}`+WG??x0*btAkdjZR~QH-ktO5I-+Ben7={%OQ1dQ3&d6WGdX+A_nUwYL3e z!;(qgrK~_2R6V)MIQ|>%0OMe;sTaBQ~D0W_>! z0)5@HzK(Nz8qJe>It7{!F9;y4`Y7j@dtiqV^9J^5Ljjh=gd1DSjEqd2Vh&tm3Kk_z z9>7+-5A;xa)58`8E==|)EA(=dsA8)`*R!XFCXkVXh+lf|6&Wg_Oje$e{smdG&;;$P zf%wp9{qip(#C7>EjBH+Bp@Q>oziIC;ul@Qn=FgpZ{Vn!Mh!*qyOZP5zr0d{S-yPJo z;w1h|J$-)bp`{&%{nBsz*}q@={!SZ&@1H+g2fyDctt=%W{fAkW5EJA?n4ypJxP|6} z1Un>std?gAV8h5o9+siKpj zISq%E7P~!NlJ3^8KbePWjnIv2e05)=8XwS?LyRR`dMrLFpE=DI_N%v>R?b#HKhR-0 z2)Ypd%#`jGpGJ3DvfFVZ4Kh%#V?tJ>P|J5owJ+{(EbLj}XuN6;S%mD0CwFJGM#76> zzk)~jHkiGF{?YBI2gCRhwqEHZh0zil@*%RyYw4~POPe3CDwt7B3bUrMr)5i|j^$Jd zON=$Ym%o3{M+(3Es=!wmEYO2`iJy7?JLYJ}`9IHm{syu zM;z?xub#+TV3M^XBqx>-!*L~fD55G}zFjiyO z1DPXCoT;$qqO+QA3KFSF*Jr7T$HBCDw?V!4#(WC0&%hz*jKz!~Y;X9FRgv zDY<+aD)H*gEnr)7R+v6c^=UB`CZc3*R~dt`5yawvn)?$@&6QMPVz&sQmxHlpS>?(_6(KK3EP6xsC-T-L=cAP9&K4il2KQ!xEaYzBhUtev#n%4A9S;tCa1 z(N=hhHHR}h_C;quN8?x`*8bRe=ifs@@x5BLX#6hwiB=we4|W&tV-M8EyV=9c{kxU~FrbG@(nV@U0e(^2gz6c-MaE3s*D7Nv4fn zvKx@;w}b@*=i97s1d);p>IM_1q%wo`4Cc5tA+~tZz@b|)MqULUOKs%AK=ReE8We&p zyrgMo@C_BdCyr2^%5Swg?S(vEm>N>0@Io`HuI>TKKJEWvI)E^H3m?JN`bIwU+Nix+ z%S879LuTdCeC^DK&5q@;=5FmsTfD|=ieNSuAv#|0(~;SwV|<02&eP{D-14Rq zoEsjjNb5qy-ycDxOJ+x@{y9@VuL6RrlsFpR>5}^mI%jiI^fX^^-BfYzXE+ZFQJs>MR#l$*!Hmr_HK@OS`c1Te{b>k5s7kEl9s~UapoS{ zlKq6`4;9RNS`1sxFp~#abDGj0yQ3TvKH`SQwwJG&V^^agKo%1%+c|-W#VmDu1vGrnZb#x>r z%tyxeGq)lcGF2@Wb@#DRRsndmjO!6J7D98fN}F%19O0H&M)}ktDm-&Az#GMZ)RA3Q zna6<<%oyrJ)yP2l%baDBMIw>~te5a@4B~yN-I$g?%+Y{dcJfEU#wqvBE40Hcs0B!2 z{gp|(H`i3~LQd9j?Fzb3UrkY_B3}-ZcNbl&FKQ64D40g73Gs@)Ax0_a(bB8PE!*PMRyNOJsm9TB@=5{VX7*} zDyoF=0zV3LgavL!eda*2NI}m*eZL_lzM<&8dR2!N@SV;i$s2otAau(zr27VmYh=q7 zHJ8?dS|j~SSGeaRtxM=^tmfqG9oy0S+lS}DAmd2EV$#Hq9>YGt4w7Q`)ro`PuC1;Q zr?a$Na;gG#50qLsw@ftg z!n1*IIAvj3g3=Xq%I-S(<>taPsPwQpVR{u|kyd{DqdKCIFdeVknihW|X%FNPP6ZB> zIcB(#^H6i>)?!6YB)qh3Su#PGI0D$*?A0M3`*vagh}J4NQvk1m_}J!VPNfp-kJwM(DB8Fc^MVeH>Uzv%+y;WXDP z*4AyA*crTKGJkOyF)+=P+a5losh0(8^KOj#GOo0{W&y{7K`m*L}i7NY7{M7#0)eM ziE{aJGnD9xIiJ$+m!oZs79;Gp+!MT1>fUa@+lWGc7#lC$he`EhXU5)Mo|6hBU;B0% zf55Qeuk7^alU_Dsfe5aKA!CDhxL5VYiMM{ccv(WUBd8hf9t2&#DRC28flRPByM_@V z)qX;`yYJ}IeXmn?u%02uG~RWIGf6PgwNjYrjE^fOM89Bo=mFNILtq+BA(%dQN5RPE z3#oQ&;-mtp2i$0xGK0IM%xlZ2#h1%oKzsQuRF|*S+xpdRr1eYp`8avP8=H?4iYH~9 z7(>#19&EP-lb83S&m@`v>wsNtE%KH)ijcP+`O&A8p*^ykn`<5>u`(&o_!>c6Ye%x? zB)`|}^&?XUrrKIoKc$8; z22hk)5Ng6oFQIp=ZO{iq-(z}vPqcjE5vwEAsvY6pjoQ?z3_Ekigp}uk?TDH$B^_C; zavk$5n4*QtnD$5X>CLh#k54g1@ALJBU71J8>O^P)RK_}0Z z94uTI-NSr1yCzUCA#s~;m+3@GH?htoMOxu`uLCUJMc_U0Pct}K(Y-T>@Irg&v-(WQ zqItua82nhhsapr!0T#E_Qta>$3k3V`^N}~#QzOuJk%jf$@un?m4(d44;A1`Rx7oEX z+AHW#A3R#eKMd^!vWu2S#ywsLI_-OEckUXn1xlT76OicFYWj7p7Brz-!-M zT9J_*=R4^-{8OQeI}mw8N6uwhek1e?8w{y5MK@3T3B>2+d-6;5_PZ-7M%1BMA+npV z5I#>xPfm6uLdT)c!ZCb*&d$}Y*9{Mj>XP82$4-dzdvR~Wu6JyCpP;@a8gr!r**AI^ z8Lf{a^bPH9^gcd9nO8^*1kDepD|DrM`02_IdEJwDCY;YOvtGhX z3DeL08Zrx%LZSoP_tn1i!%aLq%p{tq;2Vxm$Db@CMy}2z=%)4@Iy%)|bQQWDBeC*O z%lH+gW5q<5?Q7FU6DsJ>O-~aa(tneC38=y;gHX4e)3f>AshRR|0oI%=E3K za~C&Hkj8nvk@F!x&ZVT={|DKWx|qH-z6aqfTQ`tm>s%Y<)$wAHzOVK;^+DP^{TUR4 zcemki(|LqNTivH%QPYjsUD2^I8h{vaoki)kc8w#75uC+z;7LF#GU`IFFYiZM^BQtrCh=zkG?Hiec39 z7)CX>dnf#4j;+-RK6c)|qDX*G__KPU$Ok_5*j>_b#4vV0^e;uo$h--L9lQt= z$>I;WQ|lj7c}@5lcgLRTzyr420ru_Rc2c>yet127JNp~nF4`?rLBJ)gj=LzQ!0H1Q zB#v+M`b(GfT_MudWjRH1N!r(UQ7VnJ_+Wrj@pOZ0>2C6D|9|*TJez7W1?JlzEGsMP zx$x^-(diMXD-i+)A53b)`EfX(WmlhNAD_jj{*Bs+%ZkaYEG&^CqN1AHIdbbc+rydL zYnj_wnCx`;%ve$U13{;j|H+m_9*PlUwA#(ppLTDMtAEn7>q^_tS_ zU-Nm|aKZi0(vrsV^v|4A_@R6K>wPc|{1fuDfw10{Z`)tAwKcoFRkrmlZsVH|ujCch zmEKIB%_$#m2_to1N-W}dZFV|tzKk)33d2s6h5Z;d+Ft7@bCT$vc|9qJ$#=M`7#a2Z zl)j?#p15MvC1=}LynO&?KUC@Ovsg|=S1ef4JgzP`PcN5scWJWC$6;e-z9^VOW{oqT z;ljPOg^03^KWRES-e>V}2YsX5Tsc*lx)b;J;RdPM>3idE{I<&S`#h#zb14RII5fMT z2vOv4zw>t{zkh2PhkNnjg^%ZW(;EW?)3;t;Bd3g3<#@QcOWjuH1~~;JuiU>IBW^#m zUGkjsIxIvhK{cg#X}xTFy}#&Hqkv)YO1g9-7yfO2{_;$~CP%O7=GxM>ev0~SH@B5X zK0ML2O-)VT!uoVt+xz={ev~mJ{g~bCn^oSZklVNbJGz?xHEb=Ye=7 z?B?dCyHZN(Y*cl1b>@oLNwsINWf&IE&nr&>pT0j-VH)r!F%hFipGsFKkhfrA;gpBa z=Lvr56X^50?%wO@Gd}lFJo=P3|Gy9TzkBe1?co307gCeQ;ewbuy@k%37cN||^ziWD z-Ws6W8qmXqGREw|FmW+(uX2T&>@+dFtoLNuXMcbH_Z?G4jf)#bTZ5cigFbxX92jOt z8(vO@>6d@B?!K#7>GPDx8BF|KwJO~>g`3agtCdw(7sarF4dj|*p(Z-EwzjinA;jJw zN4<|${$B$a#j2DD8=mQ!_Y!>FFsz*V1UP@g>`US&e*D|a%+ua$$v%>OZo@$<>HTZz zpN4~_A~}_KH#f$|$4B3u2YfJ126Pbj^C&4jjyJTai(9QT9eToQLnIOb-`$qlw2b>p zy@KRoMI~kb>0#o{;>-mhvZGHo7{uZfph4j;g#_wk{jq0yh)_wL=h zEQ>Z$)u+|ggC2l^H_p(4?0G^$UU~7 z9d`kTD{`F;e!P#-@Q-W%a_MrOEWd|oxXEIY>`^#eUbJX_RV7XS+Ci9QPu9Ta^fa~fakSu z(McUobTTEVbK(EabTi7x$iQXB#>Qu)rF)o`ZTd?$BU7#bh0s4qex!RW8rPwgKVpfs z%|gVcWU0OC6{&5~K<&VOSjJVf3}R=Y^V9?4CyAk$ky+S{h)q5IS&AT~M2BStKL{uS zQ4lST;MdmI=?DZBLZz};uaiz~KkLPd7jO3!yNdcYE_%+ctgOsYmx482rH6s#32u-H=6FFKqfi6hy?lXJ;rn0+Qxy0MHI*iwRLz6A zB+p3l*AA%p_-re;xPWmE>;kOtwQ1**cb)D$W6fypRVduJ*!zEcmyzqfI9f_%3L?Ie zaVZK)2JE;~T=@1h9r}k4AGUbc z2eFD>1fV2<9m;ax%)3s*bkSOWI|31o2^!|t`&d^avc9%9R5+Dk8K@N$9Gnpwx{nHz zk5Kca#CqSu{9d1w=fZ!q>FttkSoEBh<^&3rL_`z3`1nwKddK(04Fe&UTNpNe8_l9S zAxss{>gLTOFbg4LMjJ0mVO=F{47<682F_4TZEL?+xj`gOWfTd32L>A4L+5()^Mfk! zY@6P~E#@L|40GZ|TWXzM^*Kp7>h7N}yov3}^6R7ZQTfIf!4>5h5u-Cm%-VpVhO2^v zyf^Ek#Kb}tr8DEk-hojZLd3H-X?4f=QiqY;FrzKMftu1gA@C5aFc8h1`z7(c0--Ka z${>J75%FGztqGa>f*Vm-EJ%*)vf!iw0(p6iS{z zeKNn8Rp)hWVmqa9qa*843anfht*ZBqB7p#BmS$K|_~C%5w3o#mX|ORav>^=He0nT6 zEk#0_L6IoL*}b)AU4Qqq2R+MxP|!X75omXaxSq*)FSmO5x&Nz>Jf~mU_6}WOS-M z{nS}SLbRc8QWyeqL1pB#6G0&%jZcY7I2;7IAPL9OL(wO0H@{Ulp{~4s4MQ+9K83>}e8F`yejMV`*}HVuDw^d3ov2pUOxP zOP1jw0JP%@qX3m>$ukdE?fM~ZllT`QkIf7Z^vbNREqK$>bwu560r zb}RQaKnMo%s)ZyaJ)8-AM51<{g+})**59Wv5aSEx1;V-bX}g^wldS9v?U)hCE8Le$+bOA06>YkiRG~W*Z2PWVIjuO!4bT= zI3`vV1Wb22E#eg=CLe|H&cxAR_~yv>h8{u*7~cI^&oQagy@6nP>?&x>FM`M8vIOwA z=ZC(Y5f|6Cds}Nv9!?THSr`C+5?Jzh9e9$d)uY@LG-}g4+Dh}{&A;9CBeN#F@-oQ1 zwJxIPU3R2OxaPHOT1h8OK|+UqDjsbwSEBk;9(hJS?E^q_%>rE>fIE`E`JS-4!;FV9 z9*0ZS%CuqY+5>=_fw1_*izzPr&Ye3EJ}HpmHDm4Cqkm<7myq1b0gc>OHWTZD!F)UQ#sNG456!!fC{eE5VJp zuL%wP33|5h&)!Usv9O;`%q_O}tQYAx#B8FJ4iM!IB8%wZ{~d7L4NSZKUL<5U_;*)R zsP`SNY-+lWs6r`kPZ5NpZkZc43p{0rqr??tFlLScjHiPE3s6|Z$JV(a2zB5y%xdkIF?RrMnHEC{JXmR`SB}} zQlAwoM?cU5kdO(m{H{y9d8NCYwrXl>e*9Y)IwdD!yU85*efVc8NRj{h31usJhW2QN z?6+sS^3vbI3Ne8PXq^|x1|Sea{=2@{QXAR$uaGBo;NRa70*xPmQ%hGrsrS!0&!H1K zr`t~zshW*D2y;R{5&tk(mLhVjfc$V2P2q}tO>U;hVF#qiqu)W{9MX-dPrT%#9z#re z{0Nzk`GEmv@}uCCD}~O)&%AdxZ=<6WT8cY)BLjn;!IOr_TUZAW>5fKfxPV5w1tWz$ zC%eqQk?y*=i37o7#MK|4`#k}-vGwp#VNS1*F}yVSIZ56#Da1;h;+?13MMBh+`l!H| z#?bkW%R@XgXGa9Ujuw!{m$tPK_v6>E1oD97#ouq}++&E$^S>KFs>pJiAF6WOgi+U@ z)&Z@YQ9?6&qZ>;(!_36=DWirDz$t^g4i!RUb%c>)jPUcLH&*r+b~kv)+5MppkvtoX?@vH6cw z%^(l|??({cZ=?v@PPrUHWU>oUlK6`KG&Ge9BekrbDL<%6Z=s}Q>vOmW+(@fL;Y!FhIn3&80b^ZgkLGq6ssxDqyw8)D@UNLTg zw&c0F!A_$TbwnrQQ^}7@%ERgxrB5NGJ9G_=bv8=W+Ja-uT~-$z_z7fJ@pm-Sv~iH( z;c%g<-)T9dwfV)trw^fsdHw85r9`0B61JtQqg9JuaKvQNfBihjWajMEPrm~_QkdeE z#2~t5qQN}*@TKbdkwbTMM452LyovPyboZw_lE}`fRLd#Z0ScD! zj|w;UGyy?I7oJwA93(Q;EJ~{?p~*ZAQ*E7E>W_<#-uPzgIm}vy!?}mLQ(&)Tk+v7s zq@iWNpk?IcY}}I#3AKd6=xbg`?{l*G?s+*lEJWevFA->>r*hn5Lz2U`iuh``B6QP7 zWm3R6Mj$)$ecqLAa%E$tf6JOcFoFDXiMSFMpe$T6xwPiYb1iyhiD)Lf)djpCDN&IA zSE2FX3!<&hdiT6k*`icXSrn1Ts;1LO<)Xy*}LGv)O@k$NEM0SRZ_CcHC299G&nI$t80N z>;yTYBp`emt{Ux=-3QrZL1~S&n)O&i3@b>QLE?GMH%bgcj5fX+Nsp<;jXhU=njGtK zGS=(w&-RwMhV1G4DOdJk@;Au#-M)707sxtp_irSrgYd`A&AoLYTK8`$!1c-(#?k{+ zRAW7VHXm?!uME1a4EpJ*c%^8jnrMX|!hGM7jej~YaX{?QOXH`BL^qHz6bXEKANdS@ zHkV$BShh24&j~e3(?c*a52WHv^oav9d}<4XhrQ&p%YxJ>Ke#C1`EmSvDe6Ot-oF%Yw~;i0)GYBs5pN&OszB^GOa>=CfEzxe(&95Vb&we1 z7xhy@LqlhH6B|WFBaFNy+B4(2w4!KfX{$oES3(p)cN=bf!&mz|?neM51IFa_i=93D zL(*khEgsV4sZ8~g+scGL3WOe)ZfpDXnS7OwyrIX8hGsHLj$B+^wMiqlA;&m{0_V4x z&a8LN#aZv!v@EtZR^tMR{J7cTrV1alFR6IgJ8k z!y*GfD$-Eme*rUmd}|4nHuo!x7O3~HHn_%K;4>^1k98k?&0MlISm9?33?|6F zx4gVOM~DS7q*Eww8>d|IC~@x5QV+heRPD1-y~s6`6SVq{bJGlXZiCqqq`6NdM(C<| zIapauPcrX^m}Wwbw)d~`%lrHu^Zxx1cSa766yhvc@Og*8;NYsQ&2`q{o_xrN)E@5u zKK2}$Rbe@VCu2xR$Z(m>7o}yFux~A(Y$aeNs%$lCnLzmS_it6e=~5=%#4iid>(e>l zel1LKP^0KzIJ^@WA4>GcDaoYg6o}pGcVhQR*bfob9viJZ9^GiVK=&0!*mw01%HFEH zmU}yxQgQR|sH^^m5f&04(1-n~r@mMaAL9MzUHAuK*1&%UxDMoO=G`OwSZ^HtT=re0%G{i|=PJRwFg_pglWBV~$C zcIBpHhWg1knZ{}g%!~>dv_KY+0_~i;%Eras)xqqLq&Z##D0KS`HC#hTA9mx6L&qIQaM7SKo;k_OBP>n(I>rL{-??uO(uVKf!l)hCP2HI;=dOyU)>^)rCtqrD z-L@fA!Z|_7gPod3vS|Hx(P>yiKT|(Yer-gK$n_$5MrLMa|E;a9Dz`--Cu@z%tFP5T zJ5;Fj!{b4YkY214g4^>UgtzojN2;zxkhh!6B@GfXGc%oq5+s1*-P;%F7#a2>OPzW_e>|y*Y!WfR^u-_*HmDEZM`+mTQSDjBN&^Wm!) z3f3l5hf8L?Y>nC60J`M#|BstN3VDhMc-4L=z)xK@?L^X}bfeFwGn`T`X-k*C2QR>? z^Mh4Pbwst*5C6}gs`)(*SEk&|k}~_dyVuVX_yUL^vR0cHwYY-h)?NuB8q4q(qFcfz zVMr)Yj_H(wlnE#CyLQZ;;U-tOhK7Sy3&vst!k+d8Zhe>j({v$ycyZ8>6$<^Ic&V^) zRWvi`(h#o70~eZ&{9L{`{bOso>3>U6LNP~+fRqs+ zthB!wswRGoi_N@hnH`GwAt-&6mX?YG7rd(P(v=uCbbl9zS&Y#MK}Z3T5rr)5yic|3 zt*Uw7K@P)w8-s0Oqq8IKTbaYH4(sc)Wpd&CdZP6a(Gs)X%SFa+ZlBKlW@TpnX^1wG zY%SJ!0?v@A|NPuD90 zo%$n$yHmZ+9R@%-f8?esazdE~6!;}F9x$=7MQ7A9jK<#k?GJNDx$ee&h++yzgZ)Q1 z1@ZwawF{lhjoE6mt*j(7P$8fLf7_f;3CB3}vD+ppxb~0@V_<5oBnsDThA~!DNQjH(fv_;!QkVm2$7K!jG={$$r+P$+7Mq@cC9VRirAB7lgL_ zlYl%3c#l9GaHw=WlHGs=2>0qs+_oEG8WcNNg!GcSYuavGuf3q4M}dNV2$e{nTq(UW z@UXeRpA$E0)d#1UuRmcM41X?GCbKNoo-Wh>9u(4W7fNvmBCEt*CTAh7XC{w@@B3Li z*7W8=P}cLYRTaZ;vnD#Cwm?n$6$m2up}u>wK?X%G2DiR9*pC)zK+j7s0~1hpO9a$r zk{*A|>Y~Il&y*%>ruKTjmV2qHRK|vz!s8KLZR$Ls%u}_rCjRDTKm6cPq#qKp~p3Y%o?}eGj*2##@ye%|V3+b9tEV#1PS0NlSED&4^ zQpam=L3#-88(ih4Oz6?L$@bq826jPH5x1e+;Ny0+xQvdexFE+Kx!=7-`LHEkqpkPk z)CiT<`MrlZ*P8s2zj+vP&r{3W-B5LU>ej&oXO%Tje$k3d>*Q+)nha2>_HW zFwLRy=6C7Ie-pz>Uz_}l>wpwR%6ns_f6RTWUy+b=NCr;Mb5tk}&{A^Py<0;?MWqKe zvA#exMOux#HbhwlqEEh5@?5Fl3~u!Pn*&7-^Qh0ZQ00)uNAhGAj7F}c#I2>Q%=yVp ze{0P71aa*h$na-4m^nE)1<>i_+nK@&sY}LWX8kk0mr~~|=~XK8It;s|`@vRq!oMQ& zX0-ZU3vn9iBr99g8K7rdl6R)TV=6tL1JwcK^T!M36d^p{MyBF6f!GvF2*u#S`%;=vF*phpf6o=WsT9+I@03s-LdYff(57G{oQcERbo-rjqb&!Z zn$!JE5MGcX4&OpHK@L?7FO^1KBUvvj7ElYj+littP}Vcvb`bg(13+=Pj;d|gt6NB% zi?S^(I76$M+NSvbesiLnIqIm4LfWFQS1@Tml-;Chhh?LMv4R zi7;2sARjn1{(k~!4QMuP2tZFTkiRthUu=Z@Mpm6XHj*giKXbSZ+(&#|Wwy7-H6For zA~GA_2dEHTRaM0@{1!^Qa@y#Yv*cS?#UZ>;t%TZT(qe+gd(6*1j$hy80td_^7ly_Ua%pW^ZO#>Iz_;aUpJ0jnnqbC~rVu&m#Zb5v=+ zj*k9w2s$ztkS-}7B>|KD^XHFn72NUe3L2>C8+itIGfLMcKh1pXW-;D|{BIvQVB8_k z;R5Hzz%H)DLpU67Vlp%k_?;$?gmf{?+HBl_)I2J&o=Hfii9yhTSx*B$L$t=Qc<>49=wSrR z!zfV42U&OJ^194)wK4f^uf}b!R*)x%YDypst4PlirdBTWQSZg+$J zF(7urwb|~}7b*XVjoA2gV2>euwNNCLZj{qN#_U2C@n~PFK8-N+;02I0_Wnp_)POd6 z|MpF<%-hRzfQr)$&HJ%k939s5t7vw5${6LSG?8qX z*HuNy^}pXaRkORIoQHKdE$oMn6f`2I)?5V{j%*2gfLp%QG9v-Fre zjyzRW$YJJ<<^CEY;dPxev&{nVaR(;YLjLx4cfM^1L}8J!upg&eE%MUP4hSI`8#}%{ z@R06fDP68y;-4t!jM8F!y$8FQM0NN{C5;n;Z{6ZNz~H$y?p@i%2iytjV5Uq^_pK zUTKnz2oF6#fm(*{iA${kfMxF#MnJc+A%At2EN)FC$JsQ1t|d^LO~=3lv+E+yZXdgh zhcGRtY>&s}80cC5?h_#2cb+$KrAATqplgr4;-Y%&m=V}|2*c}r*i91oh^_#KcN=-B zHB^3|DoBmDaq;wBoxfJ01t47_DIF`+PE_?*@mXuJ@3zj*i`|;wtMxvHS3Q>n7a&ao zE7Z@^4eBtw$Nw8LjrNwzJ34=B$u;tjX(gJ%?bsAq2l=})-2D}g{qX#VLu{r_}24bMzLylM4^!j<*QhO1yuUy zPn9j4LdcjG>wV|u&4CagPDM|@Q~%d`S1tklVq!>318&Cn7MO{>hk??BPkr`u^}n;1 zg>nXRR%{F$8QQ)pS#67PsIDKKL8z=o#H*gK_Adhy9X3#mjIUgw0JODXEuST=;jQ)A zkTBKZKTn7&DmvktMWDqQsoj(Yq#^GIqc!vc8G6otT^V95V}dlzV)NblJr9p9KsT*? z>u%Aacqj_Up%N6PpA9!xXKr?7er-{aV~5`Epq3o2A-{X~?v-hzw#7mlX?{5o_L#hM z0X1lqkzN~rH{X`&Ez-C7+ckfy`A686&)?tDvZS>>&h06$yV=;D8XI|e`K)k@mvb#1 zOWn2BsiMz?-ixG{>8oH>ZY zHJ5+=@1Cz;SI6Q)pe#GktjPHl%#pRkg3?zJG~-in%XWBdtZZ}A0e>RV47*Jk25qWD z;?PBc-A|KN2+e}x1o5G222*ihWX*ROh3GzBW3em%dk zlltLjVJtay(yTW7NkEMtmV)i1x}2)@N+suwPzKxo(@$a`RS;L|=$LYGV|Nz|5gQw)PU zJ19Gk;~BzDtQkYo@!1jwc3bhCIwi$aoeZhh9ae66*f}Ecz2enqaopl)eFeOGVOb2M z9r8-v@87?_6?=UYFLeG*)8@p)L?RaMPfY&w$&G*Q)~T8`we(10NC?JbMCT1$RD#st*cxxO1VqFNz=shkC~WTUM{q756dRs%@nBsUc|#iT<)c7=gu z!@Qd`)ki61FL?Ovi(L(7vF8Oi36 zHdsIP2h>(QB_Sd4Mq8>OR_5N*TTD?D@&tj{GsabtnH_p>NOJYHwWrJqyj)y9Hn*>7 zUv253iNC60OCMTeIdLnb+EI~p{p!vS)a9leA!Ge-!~1s)xZqYv-7|fCp^NV()>gW; zGx6CsG~(!XK5YCoHkO}f?f1uS(^WU&nlwk_vR<0xgyHwPIySijlj->#uMG+pB6;wW zHZQo9zd-x$BcrW_h|W*;TmacJ#oJr!{4d@lQ++x|u(6Yjxul}9OF$(Sp`krdIq+HoRsC#A{~1+b zFXelz_26$~mv(Qnp62O2H7~9L9n8;LCem=BR5tnd&RceWEsVV{KadP<`Wjf$x@V~# zCjG;q%Y83w1S#4qIbp@DQ+XU7?F}HsG z#IbA1LJP{n%TVxJQiB|`o7qyXHoH^<`Y)dg0-#^Q_1v+J`Lgv)8Wi0VM zkN@r@mAK%EmgHf`^ge@*HTR7tZXl;o7IFpFn>svy3S;-)oCJ9@%V9(bIpy)=Bf*f# zY}3gXkZeS0jP;b1zGpmmKxtHLEHjms^ITO`m0OZ6_#2i)n*51(p!Id6h~~Ya^Znz& zaLC}Qq50PC?@v=PxvC)6T@}PJ#qPiRIix?WZZtpmd<620$Iw=L6ELMS*PLF|wl5F_ ztZ+YZp^cSWE32Y_r8$>0v;t}@{3_-p^!yLvmL$(Y_X4WI9VJPMZ(LGuBUA{okxt&1 zzd5zGG!@dtZYE8Wu;YaDLy+B%;dHQpzTYc$KRH6G7g>Be)|%W8s^_(J7+7{VLO!La zFVGR9zO)~sYkVy7#Mi0`a3&`?-WC>VRJ1tTcoFvkt~4YS}Btp zmK2V?ng zt72!^%a^x6pfGDLbbdzirY{%M5c#3x#Q3FmR3ooub~z$EBBCSKQxjkhUoh}s-xL2D z@#GeXYZ@(lwUP#eD$*nq_U_AeT+j|dw(_RP$jBF^Vg!{}5wBi#3ObI~1;A>>{)`Jv z>@3-;Wm~eL^&9TMuI<}Fxozpnw|P#lqh-dWY{H>HlQj7fRMI^Ith;&AzocVheqzoe zzkcn&uQMDvw8KE4!+<0y$HirQ&f9zI&G;}nL1G>C_2?Hb9Hl|!c#ieHCAs4l`jgDP zJBH_f#r;qie>4~IlKzoiu64A`y}vJ?-14LtsD>g-8BtMdrSC-HwYL$j19{&(rsRH2 zre<=qcXqlN!pW7Gt;x5L8j45#i5>wE8iwHQ#>1sc=}Fi2L;G1Z7-$x3npMvy9I(== zP%cH?ZW(35kK5_QV*>AZw*3Y2H;QDQ+`0+xAHI@yKieQVl{Q+PaQVf6ow%fDbYGod z;OLk$yj??uSy);|y?6uSBzou#y?d%Qj;bs3Ubu4(4%tb`$+kPMQ^pfCIwWHnoFR@H z{T-)=GvI>0&zGnewg>*aPU=M z#KC|>D%&NvulyFy{Y_TZ{MK*DevuA+p|gkfZmJVB$3{mpBwrc>Pujn*zFDT)78h?W z|K}uDfM4+Ko{_zE;8=^W5ADEZOzw}Hv~8YrxOrq0c2)V>HIDEXFIun-$E(tq&gYwR zGmjoU>L*Q}rl2_-`WVaZwQ*Ixdw0|gTPD_sV4j#E+|khR?VH4)+Eq=>_9JnP%VL;q znts8;rGQ1T5ZtSdp_cu)F zPj=&2)U1=F58Z%ki~*-NZ3@YQ*VialU(Bp2-YTxqmEJc(=2SPzp@~jwqKp z>5OgQv(sRsOE)$)WMX6vV^C-J^fQkc+X2XB1rma zJ?iEeytn+jB>l~sK_8%BdoFx&I-bRgzjXPsd91uGNTipPl+HUioIOZSKj+c=X<}?V zeEMoj@q3f(2I2a9{I!LtU$gK+zFXf$9K4Q8rW^os)?mQ)Jh>J90!%NLbnU4wZT#Z0 zQre2f405JrVX zMf?2TuV2&fnQ)REE7Z^MaV+ZPbRBi$e|-K8{m%XSc)l&_dhRaUQGOgEsgF~EKBIzb zbFjwtjm+fB@RJbi6|-}i4oR|h#9^~(#^v;GA6P05Zw=^g=!F$$+cfZHTC zcmxC^kX<{7BU5(}TlFDh=1Ei2V3YG^L&O|%NIQ5zskOB=J|lzHyNoj^C}{WN^YzvC zz(KEGCBW%Fp<#Z|+Nw^&E_n!5)=&;`r{YvOykGc;6cNmoCI@u~@$Hn3sJ^!(NU z+N@$W1b24{R4#IOn@SYM%t;;vM0o<fHXo1;qyP?*-6m+l%{o6c1flT_#Lb zvGPYg4ew$c0(-WW}=DZ_#OIe=aG8BKzouThw_EgK%m|J zSu7$}{iW>V@>@2QL>v>yJQqVaf`H-QY<+)&NyOsN#XzR}IIfEWxh>Z!%#&lDgoTB< zR7V2!4X|&NS#}!XUDn;?rm%<{{bP5&R<+HC?(z9r0rXFV0=YDT6GK! z`+{_Ibi{y=dtkd{I2t>d{5H&2BJ(_CDyltNgzNL0g->~M_-0c15??hN^c%bFD=$;m z&`6|ODbATv_{D?It{$GBwmzO=l4O23;F1ftM2@?=`NSWXBGPDL@sMAV)7c9=m-`T7pVjy zECWfh*g!RD4REjh&-f!BOTw??Sk#3#O%jX-PR)N87931JeO-*xSn{DLrj_q5+Euu~ z(R49pLwIAOt2n~9^oH$xhR_k&rS=!I-PVvtW{f8vwmH|0nBE{|;5Y}K9z;iXXVphj|n}Nx4 z(NqWm8|0nnd~2^51-AJtJp4&+t}sf?ljFQ4A)45&O(YuwZGqrY=R1ABi5cvA@4zg) zVA^p{I+hKqX>8o(n+@+&Z3K`sUFJUxITSQd394w=5)0263DXP@0<+&wZ1f55zL}(UvO8%Jp=x3lHSgQn|3jt1Z#A15W{ZEDyxKCuo!% z-V)h#38_{)BvB5DRmdF^lg*IEv7!qand6m;vCa|Ne?jx`ClNNB7PdmxzyfAw;)|c|-rsJq?;2emt55*EF^}t9XThj`>v# zc2W)~U@_(l2A~aj`_5VNO1FOYiAs{7D$lPlh-J)k_8r%Tm!Y?vHM~TM$LGh}t!e$Z z&enb252l@|81AP>w^b=zpM&WSEv{}cl<#5}H+e_Y&xVHVNQP6InEVkbsddB54k@~F zbMUSUT*HnZo$2CVEUQ^M|M+=tk5_zO;hP5El~z5KQd?Jbzil~-S(&4FkahZ-zI%m6 zMoQ);CG9L*t+(~IUjx0YYA6ZS65$fKtG2Y+fyRZqXyBBW(CH< zw*gx}w~jE;pi(c&J)p-c%W>=)5`duOan9MO=jr zZ*vHq)LC}|Wue8u`z?VV-olb96z7tWiP^JaNJ<)wdpD=hci}D1o~P|?eH1{v5wuFV zOz#P~^jwIae?R2JIqA!vT}u~ZPAx7j`gJ)hd{|ra7=t&qWv<4_Zq^MA4GFNnGdd=3 z3e1}3rl@aKLPElE{tn>9zeSZ7FJRj)KN`|^hrDs!AE`?f!(gbNNOEO;lJ#jsJIvnh zK)Dt>ZFLOj0wt#;Zw4QZOje2T?< zM`|NDMU-=(I*A>i*=b~B%UPT4;^$*un3gj|$0jaF<$H^%D*IytdRHnP2uw&oP5q!i z6X!=pEp5@;a*Cd`WSVUK6I78pDsHmhabc(YC8=BgI;qixVmqBM@(UyZt9DMzAN&x8Tr58=gdhA z-LREeEoFBF@FEl(Dv!z1T=6Vb!Y*C8vK}JfedG#bXlK8qlzGo5`+0F19PVcwB&E=c z13A*dvpQifL00*m8s}eL+Eib(JWj98zAg{XV40RHQ<6hGtPis0r7uRY;KD zu-tS{pPrPTPFNAeP9HyhTxQy(h!wvN48u+mdp}8PA9^Y|Mm_VDU9<1|Lf729WLWO( z^k%DWjMHDkr{n2M?aIzOE8p~aEO-@37F*ARX47 z5>+AGNu8XuuI0%eV{CwiA$)X!Ujo5J56-`&HKqg?OHz? z<{t;P9*at3TS3!M1E6;`)^o`G8pl@tMGafVP(R6odXI?Fe|S&CE-Oh-rM>H*H)9Dn ztbExW`$Svbk9mHD1e9Y-iaV~6F{S%VjQ(lNM!k&@X4%cIC&NBjKw;X$5L|LPk$@1&7qZb-bE1q0?y54d! z2=HZj2@87&zdRv%p=DfD`1OwH&AXg}B_^~{}rLNmwg{(NB#Bi3A@M{Y?)JGHL zBa4wf!{7*41#Vw{n44ek|MPi4<1odOjBKF z@Sav|5ft%L`1Op$k;OMfyv3vl(J$-z33UT?_0~5RIZ2W5OR;Xr`R-B-;n=)tO2uVS z4}AcB;%vcPcJ@=ymA2j1?)zRS@XF~Dr%TXuK_b#n9dM84#&Z$wJTlSYs(5iU=wRp> zk|ayHHbDdnI1ZEnUI*#Sw>3)bhAi(-!Y{L5xYw&P8wPwfN>{GbDh9DIL^MttIDb1H zK||>a1%zs=I~_OxeG8p-*$TlU_-*t%10HD>UUqT2O$RE9C$M!^Z}|0GW-L^H6!8mO zEyAwYC)RSkth=JL`IV9*wnl@))4Syi0iF*F*L!=5=;qF;wY`{}Lo(svy^nRRDOh+y zvlgG^<%N>Gsmm|--qBdH9F&XVkvbTbPjAmKUV-Y5 z2r#6n{T14v7JoW&^ypx|^`-^q-p5IUamMwcj*>B<0xA9O?g9Q6PLQ>Lg_=+5ibGy5X-H@|5Gtg;L?bM6*V0)$1A>ma zmKL-&r)R0)A3%S3oM7qr|CIeWW!Zr0RRH0978wb|U7dzQ+O52fqyO~5_`yB5M5$K3 zgC%BSAEZ4>p!#w}&Zp?cG}?7)Uk9e5ldfw56Nklf8q` zk`)Hrwbpm^b?PoEd0pME%W+R2*Py#5Gr7`x${;OA)A^SND*B20ejOb4=^vgKRv9=* zvlEoY7`cnA27@uz#%ku`&h+zkYi}E2;ZViM?PdG$7$~4E7$r4sRp-PZi_F(+>}HY0 zNhS_c!ElpUh98Hbt+tE`+ED*29uA8h%kT-DLx!1gv7tAk-~dS zW8JyARbm4nvf4=5+9s1aOYVt5_4qm{e@jyx!|+mxS*%wHyA5*u@_jb zBv%n>2o4z926un7n$Rx%K4^CYipQ5PUq<@R`SX-6v$82MSK>P0kZ+akoGT@jnn#XK z!-j=GX@{>xxQs-arF>5%n6R%}1F|>DfnBIN=L2t8a%q&XDi5po-HE&_;ak-5<3|ts zYvE&up~#eI9=VSFKka>aJeAwq_brtssgo$eNg^4GlvzdE5h?Rr=DEz7JDpNWj;*K+ zTOw1)oLLE(XEH1El+3gJUhB5|{eJKB$MZgaynjAEpK~gE-}hSUTGw^0Yy2)OB`;OO|P(+mZA~;MB`^%jQt~O@bLcGeB`skoGC{7CXO3ZIjOB zVTy@7s`Cu{?<%WFf`9Sq{&w0G4iB=wrMdY_0rq}5<3YcJJU=4nEhkw=s@I$K!ySKQ zwkPzc+c~!$-j~;tyHwbnh?|zpIxTH&XSv$g`E~`cN%!>MK>@yZ?>J3)!c^W~x(S)8 zbC8ro8Aqdz42yHn__Auk6AC^X(krN6cxT<-X5Vdw2YhZ}$Ae9h&g?M?ZyTRn_Tyk5 zlS3Z7x#fHz&39HOyQ1|4iT!sy!6WqE>H`VTn+akB$dkOp3?Xfj;P&v*QyM|m@DVwv zGq|Rq;hUSQ?rr5K>V3hW$?lIx$RSWS36r0_6PTD<^^kh`ZfE4^?zjYgnqS}I!;FBs z<(Nc7c=)=pg~jMu-m2W)#cEiO1Y`>bv7YfCZw|^Z_*}s1ApUE1wdwD+ahnJ#McD{H zCC-oCKa<{B6w>u|CTIimIi4jJJ^GrH;C7Xn&; zA??CfW&O_%r}K`_j3jp?tT^n~+SXU61eRgo3iZA}0`0aey-m;`op-wk8`A_ayDX>U zzs_~@geRwmg@wtu9(quLjVU(q{&JNFY#-{(k9cRHAMj4A*Avol57i^uwf0s>R(m)D+ljX_mC4U z5!{l%M8BW*!G-NUTT29qYEC;|Yqy7)YPIgzfA|H8 z`8L67&CA;Y0xUM};!v_w@mZST#RIm~uiF@P1*^Z`4&!H!h0+{#*|JCr#l}D|e`Oz1 zA7Y4TyLox()DD?jOZ!J_v!o8~DQqvOi!+-G1w;*3i3oAUCJ%YpG_`pH%$gx^TT4re zG90TLg8IWdv!!&m89IX-WDcc3q@HAK$jUFp+Xg)oBC%dzI zW_QB7m>3gq)w*{X+Pb=@B=m%agbY_e3CiTppCQ2}eDs0ivc{Y~*+w?U*sJ!GXwt(` zb1*QmLHK5+74T4Dj6#Ul;Q|{7xLSgNdQpx1@ZI!A!skw@e8oEkl$Lx06zJEC)p>RuIqWP(5f>oOk#NUK{LP}P9_bGiThqrq}Mn-6V9?x3lcO&|& zH23%O(lj49LH$*&mp3*w8T@i9D5AOTY}E-#r$Ly3gm1~6fP~uZ*N(FbP=D-&!ibD4 z1C6^tBdFj?S5@lHg%5G)QVBx zYSYo^p>}(P+cwtF=(iubOSqPx*HA@M^U=eHtSW4;DbesOU|6 zW@{T{RjrDyTzj6CJREPIqZ^-~&0-tqe8a5mMsH*I;ve&L({44sX7>by_86(FsHn)B z-6JbSx5Ot%AxA4T&uzmT;;&1=kMij-Xk%TxJsj>**8f4a`964ke=YX7(@hmDvbHAc zb*d+RKB>0;Rq$yY7va6Q)D%EWYtTvV>(M6(F?!MD9aW+0K@nEc`B&*eFk}qjNsdeG{4Tf z#zigW>rXNKt@GAnwX?S{=B$#~@Vpx{mGvHJ2KitEC^UTw-q5!1(IXGculRXw<1<~$ zRU7g*vD0!k`jW0pFdZPwAgZtojpqG!Om-9#~}_3nU(pAYBixiLF)Cvl6bw` zem5}qbdR$?2E%I6$wYGgs)x;Wt0gEr%iDVYyvMIkG_LFOZK=>~pc#5ZrR7M8AcJy* z#BvZrkm!QWck)|>&jF?Y7`m|!#54Hjp(adGtwo4Rkv{M-Rz`Km%P%(hV$;i2cWh$o zwR`UfZ?l%xH~7M$q3m(x0H@68^PKLVE>KD0d(n6Ax&TK0ARbZ3AJHZxF5U?WX;y7s z8Zx6wEBiWo+{QYA6@t;k#GBjNjGztyxzBeX>l~bTF(Fr1R{z(s2Tx^H6*Qmd>UPcE zTR06it`pY!fQ{=F)VAJ&6!!@TVI3*{aP5RJeX(JQAOr{Pv3(_i7qBe}V+R7ou=4w# z`Wm23rbO}fANw0*K5soy`k-@i!`89Af4YmRZ*S=5(OGT%y5!2*+AJ)ry=A_6v2m-J^L zz^<8LzMp|lo8HQ!u1%K6!{y@B{3Hm+0|y}Q`nXhyC@TE<_Q{nwxX`82dkTrmY zPU2Vb&Lk9u`OZBL5I z%U`8h%li0n$(t(9GY}2xbcC{2$1Q55y9M%nxJVwS-R?ZNd8n7?C z=rg;w-(MOxAp1e$YNV70EHS#a6a(+(;)E;ym*$GjWq1V4Y4kT5(Sbpsd=&94E|(9`pW zuC&9DB7e#|lQ>ocgyl^Y;z!?dHQX$@Hpdd<<1JpTL6%;FK&YT`E<@W*FK~n!ugEs{ zL1BQT>>j4@wfCp?^zY)7hO*;0>6^cw-nDhhQumaXZ(3T~*C_20!9pEX)r`tod{ICA zH@784|1#$EC|inT$^)6>`pm7mLY zKm7d)4&bII419k2j&Iw>^=vgH@Q?pBLR4Jb4&V-%xhQD}NQ6xI`2tnrxCA##l!dX0 z&g{0){>Q&-0qCFsgNC=tkJqhYe7?ubOcA|J@*ZU{uiB}_{)JAva?sqzo=8bUtED&9 zHRck0fA&)*J?{Y6!_uhLiu)(c?MbM2UKe?YUejz8=1cZq<>VJ@l{w#Vbv=E9sQ+Y`rTX>I+5ZQ~csk_YrRJaUEe zszk&W?NM|8OYAuQGT#WV6$|U0e9`M&Alh}sgaBCkzl!SPNZdR;CD18(OirzZjgf)D z%VKl6&Xi4zW1C)G|5{u7&;%Nu)jTtzqX(!%@wKMWQdoQ)wRAmzxWMH*4q&h8IhS38 z85p0X$jQoM$jTyMy1=M}u{!k>{cc0b5JsDP62}G^?T=uN=s0_lyM{g>mbWh71N&mc1+FWwI|_UvPPzn9k!&iF4V(UlcgF@X$cxZX6X`Jdd zNEt*gy>1)#EU$G%Z+C+O0xytX`Jk4l{szhvuD{Ilp$O8+s1OQc4Yru#KN7@l{~lJ)8byTN7; z8Zl1e_tSLR9}KB1EiEyO{RcNczgOGPKltd!e~y>*%hjNh}Wp)tKzh zff||jwPpCkSGNA1xDWJKY(;8?-USQ*2_rLH8a=^)L35NX2s6=g9gB~BU6tUb3|>|- z<@r67=iPFk)O-h6&i?d8hr}F5sy6wlIfNpv%}?S_GVp5F>oNqoBmbWwSF!*4*b|(9 zh9v3i*y!kdOUmHCd9~nq!jE<{l0ScMc`FIcCcK0~Qh|ABNRh8wE4(Pn(0-T>k=tM( zgQ9o+CZR*cYC}hjtPUJ*ZgdVk>iGvn=gwaM_ZM|MMt{uC&0RT8;nBq3Jo*4N2Mra; z4ZMNopVi4H4-q3w{bq!a_FN|(!0A26&AM~zmb!10v43y1z=7_S8)|GkJUof%0!(NZ z3xDf1ePalgyMhhRUg`#}`a=MqN{lS>0$aFK?Zz4lUFBJkGsxeXX{91M!aqbH3 z?+v{7f=A;=l|ZQPD(?wy?&*%r6?sz*yTBUNgDHh8mX6CenM-hC)}RcUrlq2?AABwb zZd*QXZY|r*y<6W&VH}Ysw(C3lRIuQyZ*UnGr>wI*4r&`opyi@nGg4FUyrGcc?C+1w z0UW2HG`6a;a%{ry0iwM$h4x=L!LUM6l3QO#9i?tk#@qjUyo#C{xr-M8E?Uh2JfigS zO$l9Lp{&!|P>TUU?hmCUNSSW3#5%+8XO~9a23%89+lF0hi2?%F+3dx|-{AMi+xa-9 zS7@+IZhEw(Uca}LH4EGy*MgqQ(>}dZbriAPcuEmlRtCw1*hdm-`ueONHucTFA5?|& z974wOe*Ot7859z@{N@BGh|vY}`0}ap@p*L$cYFU}tyG2FGM}FQ=8{Skj4L*Go z&L7i(TUGo73YWHky8_w$5)Z8&ckM>cNGhT>$NmpmdD`{k~Fze}4eZ+W`2F56s9;DCFGP zSNio5I4q(7e_(KGCsPd6F@k~%ymeVNB5hLx-}`%WEB!{___BUBBY84#uc*!Ef(j?| zgM>fnNsfy%&u$xEf0dxWJ900E8Z3~N2Go~4;xq*@QC|p+LQxbyn2{Ye4!9jey?vAG z9Eot6$+@(vtF14BIdR-(^2YV+X{u^P)REgU5!p3Q82W=Pz;^{@O9Ej@t!Cf@hr~uKKd!e%+$?*vR)b*{| z;M#({NzqBKC%f|)QwkQeqvIalT+4@Z`CEHGI1u@JBSr7HEq1%ebE(lhh5G(JXrA<^ z4}c16xy{o-cpruBY5+E3C)BoH@~Z<&F==uv6?%@yTcM*9&f0$wdbGIITI9+~2RR8?>^Yx>S8;6QdMOyGyA6F0)er{fL z&AG@#BUEEapOkX#LW$GInA4fM3Tvnkiapmn926U|&R;~ zT*@u1H6ZX)C$-9ZU4orGW%HQ(J@W>P@yrcTta>VWmL3{F+%uKA{@Q;e+b@4;M7S+?7+)m8THj)uCrI!#~l<+}i{XAXFB75jc%QPZilB>$tA zicZRg$CNGhfwIk`P>5L*@$4oBLy*mT?apj3dm|6$_|EP3 zy|?beeBk_qf}4_|M`EVXehe`@EHXhEcb7KzrFjd5DHI*IsH$~~JZ!WETtIOuiM_%# z*QC8SJlv_re4ya#bN{rg-@R)m=Kk3{qE#sI71}@Hc!QLPUbJid_&gY(${Em7zlt59 zeof4XiHQ-BZ_WbviJcIxfg)OgWH66YYL4Q%YY%1Ge?r?(jb0X2K5en3(JX5w0RJCj zpJ}_i3=P))&oVVc9Y^-T?Ildy4`m0YD58)=VM4&6!jX7Np1LKp)ryA5hU0)HexTP7)d+VKnI7j6S6Lm?}7FKAn^ZL+@H(qdqRAnAyl zHxD15q_Kh^{tj-+s3x#fV^n0lwb?DCzn za7g^I12Kvd6NN=(9Je$JKGm1pFw21I%B`{k^RP)@?>0A^cd%L@^nUrhw?%dGHKCZ=?_4wwZAg3ay zA*Xm=`t%>nTPkc#YXrr&OW2>2y0c?vn6b~z{7}VnJB@v-j}!}uAHBI($V>=aRN_B` zEw5BuciMlrfA8S*6W;i|5#VVRd4udOIUZFO4{(K9d#Iw zcS{&^nX+lK@LX4w1jt|mfvOn=f;~VKcuW|vDQE@rIBzI>j@`Hm_2@wyaw=;zzkdBH zJ18!SVNW;#Tp}(9iXaA|k1~9y0Qw61yWg7~eO)uO8Wg5T1S>!sT@vUQ=3;Ej!F*O} zI6R2p#a&Su10XHDuQ9-?8#1kq@G{FD(|igE4M}zS(iG|_(VFECe5=ExQ)L9e&*KH() zxTYSv{+-VI9JF!i5sgSvo?>iE#WeO%^jn)CE|52orV~8S2k15r(BjLWkN8Z1E`4b* zEI*pRV6HLXxyf=(G>dj2d40-YE*jy{FQa=9Enm7>LzMyx0tL}E2B;IqK>P&>$7Dil zOl@rYdjLFg0CZ&?$K7)Tgc;TakdLBJP5IZeHfs@wD!%LiSo+WROgw%+Y=As&))ptX zW05+@Bs}8;^oDwA4fvT#11k0Jm0GF1<00u$5~1`V7x(jew=5daU)c)d6y9t;EdNW8p1Eaw=WI z5)y0jJn9k{R%LrNdpBHBbaw)p|J-ugt$R94uLpO-MU-#xD>-igeVYh9ff*!kH^8eJ zHW6^wg3jTD{J9u`nx!RIV2%*566%f|b&G7VEbs(M-PgNI4MM<71^AM*FHE#(Wy%4) zbt*K)o5i|2cixyt@}9IZ$cyK#BL6es$06#q=K2#ZrOR=);#>}g4AEL>{5lmDcQ_kx zvzzOI6YXb=#p`(dZn+v88|POYPkL^D`}VIVfL$aVHV{JGbNudi$zK%*2pc!vHY|OA z^X3iR4rwZEtZD~9!7?TEY(yAaWsi*n0~+LTkjKf2SSYZ3&B(RvE~k>8(PHT@!sK7R zorY%7c)<{Gf?w}P{9kWLCzA-h>k&04$$KzNT?n7cwKJHFFwR|##Lt(2eCUNrv)`a1^O;wUd2a_ zK!b2XuV6aVdnwIUfWCT#0YdBMvj?Cau=>jv*;vuA=!sjP9P1C@gG>YXuUe>ht{TAJ z&;5aBbM+-Wh3Q{LBObsPb_^8KpJ?gY=9$_p*j&!{@87Ar-@_AbxTtT3^#nJ?D!aVS zBWC1k0>0?n9`q*K>W}N5W{e7eY9GOlRPjCV>l6jfGSQ+5E8=@31G^y-nupVAjvjwX zbxZvaG@r`nY5_}c&WR*`cgC32du>{2_6=YYgpHa?!U`173OtkDR^2;_duMs04KJ+L|36sD$aPuhKz_1S; z==qgzP?RVnB^6=3vP?2@;Q^S<9<-7Xqn5*cI!VE3w+y$VS+fCLG;x0xrDcBvhsyAvBKJ%E8-1@rUEYs6E~`2vUP4sXmWp;0qMf3WkBOm-i7{ z(Wz0_bNt``R8KsP7AuOANingd@*Z_lP@!}>nEghZyzvS>Stqfv)DK-?im{?Z3gb25 zW0uW=c=xU0Q+s;2?_Ymc#KrTN9xvcRx#2urr%GLKnvRq9E)eF-{vZ zRv`xCLfZnUPe&?1pT%0taRG8BKKB4 zXYTRXo?nP^=cMtGRA^!O$FZ%K{V!bv*1;H&My&5oI3@#F?As8DsnBF4-?vz*$@@s< z0Do}hY0-gX<3|gfIFx_r5!wY85i9` z4z%MpTQEmRWn6+;6mLT!J{Jcwl`a5)XRcg)m}5ZGYcvPKAHa@D(kYyTJJ zBllKvxDy8;W{LpSL#nixfXx1vN)R_`Vrb~yCR$QmT3!(A%+;zS#@AxKmYGk{w%~-# ztTz|7Jm?c_qQyex2AHTL)0=yK1*q6u>WFFk4*ReItPU6^KZWIQZ3mb!&3*W5o$|I7 zg6jLDj=UA#g_fQvC?=L0o32}eH6vy;ya$Ar;e*N}3DQ6+2UN}7hSMQWx8VoQ{+n~a zpHrbPy+~*TQwoe)+mQ4Vp!M6WnGl%SZbami%z#CNZs z+mgZL!`a@ApQ`+5>PfoJ?I!Mx5qshVsOv#|0hJWrP7btO9xzi`ui6U|(4hxdM*JF% zH-Xt90EmtfA31!eIm5;Xl>(CKUv_X{sw67IvA^z$i=RLqxd&Z_|b?}K`Hr&DfjRogcxcD28?6xdY`odRUwANGgFmTX7#&h zWJ_l+zWC$l|CaGBmh&w;>Mb$t;22yH{(*lt1AtBncgZ9Q6_?}GJdO4@_#NkdH+BMq ze4Ybx?x5e0#$hUL2Dxd&e-Gj$LgWDGeo^pMvaMb<0ZP*BH=_Wj*Q;RJDY+mkD((Q< z7#-k4)2>@RHxe>mnB3hw-aGJ-)j(yK<%Cc))(rYxbJp%F03cdNkUg)OsTO{1OF;sk)#wFmTC+qRi4=mrYFft*J#oDi>fcQY!(WXtMjmvJ9*ZK-ZW*)bfGlSbvhhQHkh3QbTp%XvFo}pnUfnwgo4DBR1Div+IOU+c7-~s@c;5# zd7p*r*a{%&D+@5nA%^lX`4h3n6d;#$h8pvZhGSs3! zPnd!9(=cFc{c3;+N;G}(jT_SM$fr)-N%QnwnG&;w4!6;R@5u#M}wwiqB4 z$6_bU1g09|ETrK+oSf*&nUy8NguWgN7=QqjUgBVUY(#?6mkf7vbMq*xQViS(q;^`2 z%^F$n<$%y7ADjmGQuWXXGMt%Jh;`m`Hq~`Z4B3F-W}NVw)Z+mJTXib*e#_@3qLLjm zkS-e2W`P(*Q= zw**#YBE&gNJUl!~tQ17bh9A;560X^5r=P8MCKly8H87NS*^`U@B7m0aAh!C&AHy zJz70cjaHB34iMe#;jdm|nBhSr1c{Z+vX{$=3$mA?=ZMGoC&UQ{=0=;shZdk*L_}j^ z0J#1NPBwELqHt)9#M-YC9_Plf$tgls^0&u8fP;wn6B`_t&K-NMs}A)xH?=f^w&MA88uzm#SJA%f3p5O@I0mXpZR zP!ES+L@3S}5&=0-xDIaQNF&Vx5-1>mh7Ul5D!gAIy2yn#le zNUN(^fERp^gNwMp_X}=gta45Uqky4SJS4yo z{FN4N4ylo*DxAZ36cC4L`(H8=d#YR8*#~ik#2WFCNm+n7-Hpa+v2LfXS5JHajHs~02vR-Djk zEmG92#d_q3Zle)^#ahORHJA%akPpDdy+j+=g4ARZp_XH^0c>uEif8M^)O5(a3LnzD zk=+G{6Avy-mQZTUtYEJ}3LgJJC|{Bws_X(g`3fkEb$lOa6Zen#NW0P58xf%^1$3}!pn;V$ z$im+I6Me#Ow6m{hHhhYAOcSCWka$vvy=w`fR+s8FHjrj1WZ`mz=-O9g2T71PfbbP? z)-ig#2am(p+M1VeJ$P^uZAUtX9Bdq;B6_PaGsG+dW7#I`6*2M+6a7u z>$b4W)bw9TcAi$}Y0iNo2KnYLi)TRlqSvtigZ!Zy_657)7xhuHVw58XZnZ`c%H2|B zP$mxFUVXNh#(Nf0@Uvft44}$zsuVv5HfoYnvA)ug{i*j(`GYz=N5CV#3a-7sv{vpI zjQjvuB&u+tNRRR2fucxH5{lfxtpwpiO=h)WIX1}6E}lWVq^f&&@I|kpJqH1WFrkoq zB!6+eQlpRvHi5;)GAOYnBI6Fq;4-BUUkinB>zx=+{ne|AiUSG;D~*nM4dxz}qlv&E z{Lg`r3?Hf|&gXE{a4e5$z(S#RBy1HW_glQky%6n^4^9E;?!(^(N!!!Sl+9)vOw*SmeyV~MQ*DAr3P(&(KzgR5t#CoU zGHq=>n&q#J?`#`4!DdP5E`#5+L)(l*d-zE>Aaf3ZCvbZ&JivC+??+Jh!qZ=~vRc7p zxEJVGIFG?$STH~0T?Z?;l3@e%v)xsDJK_yOgu=`yjQjR8D2EX}+j}(FIc0cB_VFA( z!l}%$2Th-0vn1t!jc)|Id3(*w=-vY!J z{`BdM=Xl z5@sR?Tr2UV3X1r~NV=^*Ms(QLN94WxChff4k(($DJ-01&E_tkOaBoCtvPVmz{tJ%w zB5!h{-VMzwc5Y3ftzMAhs)cL>Ik}fFxG}GH{pUQ&zeaF?$6N4aigC6b&@MUv{)*gZ zxgiNRb>y3;mY)cY+J_m=LulX1i=)D`I~g=YTv61C9`SSMmS}djw}Izqcpf^Nv+W!m z=gu&u)d6DBh7lYm%WZ@-@PzD0=kEM)362$8=~mF6Av&QuJiW~!WfLF?#${}-9$mpG z)T)q25zaXep*6*TTn>?iCHrivC@J_???{@!C{Ywc+YJql#H3uf%?+nY5o$pF`>;d^H0rf zihqIm@IMjdq)}(MUNFJ_&kFh2;B1%leUS`Vrem)g&4qPu_!QP#i*SKGyxPD4XOLz# zMEd^wANA0vPSB_G8E{9E0b%AbL^-O803I^zbz(1+AGwx7E{?26U#c8pa`!IL29DxS z0Qk5zjO^89-BKBWoY8lo{H!c2>#>BMhynQ^VZSKXINqw1B(3zJCUiki#7i6LHu^~B z;MpnGwlkU%$XFie0R*QcNtEm25MW_u&NEK--jP2KhD!~kKCcnWctf+_8x(DHfb;N7 zz$#UyE(h|T`f1Qy)J;f!`Bs6aVjNHag?05tUvF_NvES(K&)u$IltuOd6D-QLv$JPm z9dhUE%B%n;6-v+-GZ@a!ALL_%>wi6jCX3{y^yy1Y&|S5Vru5_R4jL#gFDvsh+cvh{ ztr{-ylZtR&T8@P@D-E=56uqUjtMzdyoVE?#iaW*t{Mz%IXIPUy7F9et+&HyV?!HogRa(`hJPbhgidVd~(yGUEHZ zAAUTo>l;(#4Oyp7xLzr52r6Mb`70nN(q@ngDgWUEFr-P+mwykL8wF`NAp$tJcC}q1 z2hBaW3Fumf?1TKYBWchTsfUKXWxDi=1FnX!v9e6P3%zIoPOW+GumbC&Z6{z4#NdoI zBtW0;=tFqm;0@{74gWikS`{YdOA$cg&YqUf&Le^qdzRNGMuv0}U5*^Ghn9BTmN-w4 zYS?*M?}pEdtS;}xkIA1JwVNg(oU46uxbve)Rq&JnRJ{-t9c>N5;~UH+>Mb*g11}T| zSnCB4DeggBHkE_=MGLtOKx`eVK%o#nzQgpg2R7ez8oWBqJ7DDG8Cy<2&RGGQ(kzyN zoHv-VW8@CCPzTxG)pd!@g(;a^MnLE5nMx5L zK^)|DT~8qI6P+Y=_@m)P;+_#T^g2$_uz_G^+mGJ|K@8I2ozFOmfdA&wD6csTwv%H? zMSL5hp8I6xxY;Ic@=TXS?h1V+H+Q(o8*{|%~yOmvu(s?ch038 z*aBo4bM*N^Wp^odY@=PsSDz)9+DjohS*Wuz-+7!4tu)7;Fm!&DTJ^9OF zbYz;bez=8CoM>!CoMHwY@B^s~IU+mZ4%B4opE`4Tu7(f+jGqsvC04uYs~GJ4?e*@* z+`vzx2&h22##sSZRvqtMDm$xG(=bd+FfFi2QB~Z~%D0>pMG|s`icAhS= zEd(wYHUhwA@;y+{FO3B!_g{NU$fB2<79g%Az4~tUZ-)5qHRk{L(-8$}lCejiw8rtA zkBx=4a=o7_T?wY%Q_>$U43nm2S>mi$<7YL!llxQi^@Gz%>jxEX=aae9$+r3#Tg$g= zW}NBfhp{y0nFy`?4XI+~+`%KR1*Tbb7RP(XJxEi!oeXJoRd(?kp$Z+nz1Lak3<+m) z_27vQW9x(ts!D6=srPevZV_IKNrnXleS@N_Jpqn642LS(d&`S@2emQ%VicQ=49PrM zRpT%x8Pp;~{NVJHU%@tBy0>M{Gl{c%se9|oko}Qp#s9?)cRJPk{zr?A-R0HR@odiJ z>qN64i5CL_u~|-QGQ?h`)#Zm~M2VLJy)lx^s~+2lx}<@k;}GYo;P8GiphsvG7zqz2 z4SEGANLsDtJj<4I_kbkim8>fa)4JQH>^UY<61T*Uc9lo zmup$$#?-hj!)iNN7?4lv35*U~$r(H1DUdwpIV;iG6YRWCy>@yw{f6gIhu7)JzS|-i z(Jbt>*;6gUZcPrZgu!zHp(d;LMdiyyuuQ2DA|hf7D>%rvgX!abVJyn-vYnlctfQ@$-M@4nTkeT8TWl7kX^fCrC~w*uP?;gWP&3z< zQId4JVuK?kydx#hIZl-}BUyA&$NS#yoiZW)lF6!Au1Ljn{Jgg+4{Hue4Li%EkpG5J8}m)S?n?l+{=rcFu5O{|&`Hk@M?G`NrY`2tZxvE{Z3(VMtnUOzSk8GXG8GZG4kfG_^leru!& zu}HjXgB+c<9$)PhI=6b#v$gh{^J??TF+!nTuqQKNBe!w*0vo~kDAkC4e))@CGQDBT z)EVrPItx`Cq?abEw+elq*o#OMoJsE;+YoxOvY}+Mo||FED9}`Bm%Ho6V;K&s3&ulxAKOKYrJI$l zlzP!gliGXTTROs6-YnM*eRC-sHZII>oO)QfGB!Ltcz2=q+UVI?ktHS9ZpBs6XoqFv z!9y_qDUzozT+b)Uc^=$%_0X#h@7a=g>1rFy($aKkU3&DjHfkk?dkjSDq+iGO-r|Fy zxyxhqX^0*i>EyimCX0YeYu^u#Gp<7CUscJdN zA#8X!c7?2K(p$?no*iM-8!egVMqK-Lq%)u{Rf?bu>-*Yn_PUmFgLBfyMdZoy1eF`^ z+-usD)xA}|`;))7KcRAbNz^MjbWGe~VKOG;$kd&fFvS^Z&h}F+g%TA-isHf^oRbZq zMPcoBLI%}~x9@Zuz10|TWb8uz2{W>%q{c_h`K6~0b;5V<4J#8Bc&Z%y^(SBQtm#*q z(bcEp0fQ$R;fm&yqF!SBI;mqTb>BHOxN=Tc&;(g0TDz+e$zcm4UucCEbgCDx>A9?I z8E1*(B`Gg?OgE3mi)IOMgeAA$PF^<)jf^*XLz0xK!($G-J#XUMQes&6!|Up-H1aDq z9R95EzC5#%QBuREFhd@iu<0|XSyWnZFduU|+Iw++IgU~6b87CC^#RqI=2xy3ZQCNu zq*?^$2Zu+*9cH52bw~a^TbHTk@$p=3xdQ*=?GXbS4$d=gE)mHwjb^8MOEhbhlpK?9 zuRO5`m|L4rb(fe_39M*0yH{&+wU(?E&Uj0>;&J@o+1j>Kldn1izASqzV3K%H8uFT6)FyYRCC@SE38Qi;8F5Wp|E#*P)_PHwBX%xAB!*MZR?)=c>dfL*EvO9Ma-W zJ)LIli{XUU8i${xI9~Fg#5zONfv+2?`sXfsv`CXox^GFl`$XXJ7tMUT<9BaaE@uyq zE~YdV7UTxT&=rkED%#6;eCiOWYnt+o;|)*^2JZE+A9J!HF4m+@rCcq@BCa`^tjE67 zZ;M%NB*?DkAbnmF)It5skj9ce{Fs-8e+!5c#pdwLz< z6kV*Dwa#;Xww@9EYS+^<`V2Y!$n6QO3+q7y-T{X#+=tAoEtTxHq8cA?}KB!B& zIXo=>O56|_vi|an`0%+!@5%|Gct*lTx9EbW$YkW5cQLzUo^X)8B4($q&SVdZmcb_A zp)#2oz1IU8#IB%)S$bv8<?@g($_%q>-sYCQu}y_78+sNr;XL2Z5H@%#ge(G9@{d)x zpC-=|#2IGWcjFpf^Pd(5pGMNwNSV4*J0UCd?{FRZdv1c;ZjbrlgWbHlh->TB8+oG) lu8~~GEc^fdQ_n({)^Byx|7@BCcjrQ;Tuw literal 39156 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 M*X2|GGWh3z0mLJ~F8}}l diff --git a/travailleR_files/figure-html/unnamed-chunk-51-1.png b/travailleR_files/figure-html/unnamed-chunk-51-1.png index 1feb24349f2f76c636ad344c0f2b4111fddf6556..31f4a296f6c9fad7a6b69a715df2a5792b575839 100644 GIT binary patch literal 36482 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

XFvY^_s55yrdIrZydPL<4W{&}%k7ezWmIaU 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 literal 38525 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 Ctd~jv diff --git a/travailleR_files/figure-html/unnamed-chunk-53-1.png b/travailleR_files/figure-html/unnamed-chunk-53-1.png index 3835b02cc02e228037e670abf1cffb45512f4b12..139ff56eecd2684abfe349830682400345c5f1a6 100644 GIT binary patch literal 49112 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�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 CQll3D

am$Q3-?=76Dx1(h z6s!X377w*t>XquB7zG&bUe#Q(yS@$szqZCy2qLf3&?tVj*ATV7LA0q!z`xeQW%xE| zu6a`aC#NQW(xHq#LuRJ3M-MhR7vx~m5SDktjo3mJSAK=D1IV$4oCr=+mJWVcZ3pSV zwIvhXW={UtB=pjlreca(M}9H?=^(kdwrVOKTyl{< zb(T&H{jIL5MwA4$8jL}J%aC)6{5z_aLOh~BP_-Hss@Xr|*_GU}dY{cms1? zZwPd!`>0MYxw}tUNb_xjQTbQbMxhKTSjf`z;T;Ikl*T@EN zP9;2VGJGe!2@e&ik1k%}-IOw=A-nA)sx9QHo2P3PyL~#T{Q;J<9sP}8l3^9%G}H3; z-h7MJJ(SVxr%l)*I!iWX=C*+P6d4=)Db>e;*x!z!--Q0Owa6i*s0U37+<1dJSQwh0HRrhkOcQ2vK;OJ5V;wT{`WnHFZEldSdlnGZbpFnQxrExWv4Y(qjd+3cvwGuEn~baBow)VA5a3JF{?4^}z~jxsu#Pa{Kb>1H9+w zQh%o3VJtBQVn4L!<6_&FKbTilsUC?Jym}0*MKzplzZ^;-dM?P!<0emDlyuut@G-VlBoDVcdkEE#u|xQa`8olE&nRLKLPg_7gwjwvjI+zE1cI!h!DAV z!@{TAlMgnZj|B^`@Far74CD@Cz{f}_92B`hU@9-7Tn4h>jHJm;q+SzD#kDXENmSYl zMIgeOu6XFq4m5GvD9jg>rb&lJZmB)i>msBA`13%r^(R`zLG&x`SL*PrSVP(Pen71S zrglascd9VQVsUI)wADc*en*tXWP!ZNYoT^*AxhhEO$yDIys7X>CjUz0l2E+tMlc1$}N46`{3_v$8<=9A9ODh4ZTBdW=;=?P$ z2|g~Q*0;l)x4tD4jEb4N?%(|NO$g1Jn&t14hTVxvRR+ya1$Sv>c1?YB21X8pf~g4K zq=o%?&xw#?&%y?1%mdq!eLU_@cwP<7wxZd`aLqVQ9eQj*(~KQ#tvFWZp+w;4#i#)) zLaejDr2SOu=w5L^-J#}E3&Xhx&FUWWT{ahxTObBEZi#_TSms3Hr%;8+DVfELTV@!Gk5MN;Q(i{|ww@ z`8^>}oG%*L_xODZ$uUx^gABSAeLM;pxs?opv&)BM-yBgTVGIHGZk|%9FrbGsgMv*UW9?#Vn zUe3VGriY1+#3 z`h0QS2c6&R*iXA1^DS&`)@y64@p5Tz((%9YfZddJOGp-(;8%7|CFQE#wHARWwa2$# z>M@|LtibUV!pz{iBhvg0$I_u$PenucYMMXbgIVC#>gnM$u>ZHuQ3h)UlN% z`0>DR#_AWibV4g4X}$z3?f_yNXAcz6e)hV5fNqh@KV2X8z|^zP{ak>zjK=7tkrKQizIf%gkFS!@ps+eEd_H;`P(Q9*xC8=4r@Mz+XEy= zvnxNvSrQ7I#fAkFf1f!xkNnce_O$&}=a*H*&Q-0GgaKXZ8svkoB-xXZ>el@xIy9aY zD^?f||7{IlYcM!}a|lYamMDpu$l93se9E$jf1)8qVwp6!qW`Vd&oi5>jdg%Qw&N#z zmZ?(ykKM&;z1hzh##}~&%2zlSX%lsbtd*ret*XBtf@&tM9ggZo99mU&t%o_Q>elK| zrJO^3&6cEAg5Udm#r%vR#t>#H=5sx`L6odQFz~HB2Ce=_+)yIuY=f==u>Dp24@Sb> zyE2trlS#FsrVSl-!Z)$KAXV&biqs=Mvsj80e2@n1yWC&2@K(MQDV<9I?(W$qoQ4S+w83W`dAeBb z@ACMDv}$5~G@mu)zMIa#@Z$^d)!8`0B><@>rH{Daxv9TiAg>+qyc8?lznJPHf99yN z1g(NR+6@ZK1yfluem__x6`txxv@HS#{8Magb%V?#nX~Gl*wa9!^KO!L>?!-odO*$nh8uI)W;} zcq8s`bJzy$xUXeX9O(svfb_J5yW{hsHV$%OOxCYtg2z_Rw6!QwynAQVOM{plXhKhk zfg&xY<*vjq(DkK|v5)m6Qcb^C*#wlEKnA=sNgC(^QOG*jn=gbkT5oc+hgGlTaAO_f z>U;c|dti8e+5g7#k@baBH(|f|j^NU;X5?Ymvv{A=Y_Rx_cBuC&)`gl2#0iJ#ii*WI z;>X;zy2gE}yD)zXHPh@>Qbde4YaYZFlpO1*4yz~^yCb(6t(1su9&SM$3K3|kjf<^Q} z0&S4Zoki$sLBtHRpUuS zS6TvkrgL1;%XcrsRU9wKJf5Zxeo3DXoN4W!ttIi@K6~9lAMLL)jVVWSPOsMbP|rYp znLFBS@bM4g-`3eE%rE?&_tth>A~bUeV%SvH4f!ct#f?i%MrLM4U@#~t?MwO++_T{( zdj8~9qBKHwpRnXHN6$a)O;)*AFvERpw5KF+gDB(uHT^p4GZ1d&AG)b?4Mnp66mXc2 z>6^kFAzOX-ySsv^6=vrQ| z7hcZlW&gpaR<(b!WR4K(=o6fOm0F^>(P*eiq zjJs;#yBg#Ji{`CUD$42%YhSW$K0Q1Z#cbKbCAsgoi_F-(p>}^-cCz6+-p}VSRdK%< z>pKhornx;ufwWCH3C%u@?!U;Lq7Du3XfctQKd zN|o0!6W?=*PAfx^OH<;hV&uWfN%v?2Y=+%9hZk5Kq5+o*Ti|=w?0@Z2?UKpY4SNMV zyy8@B*YKcp=udECmEc0~eAXmKHg%pYRF`*s)8$s^vp3_v@OdkNq!XkTd= zNf!VMs)FFR73(0;!o9~vcu=+sR{Ykz!gG}(6GWxF&?9+Upk_$ivv0KOF!W2V(|ewo zzbT!Ss>BY+e^cVIVn)EK#KICOJYcR0%2f~?D$h&r-(}JGJl>6I`K-l7cF<|E?OKU5 z{2_R3T``n?W7#x;+Bz(G&9EsL}9Gh+|z!)a}P3uMVy zvNKq`Rj;RNj%&%RP9jYdPG%g*;qPAbQYCHem9hj|_~F^qmh>rCN#AY+Esz*>UYRO@0%FD?s$jigS!^O+X!)s+GCi4G#BPoYpMII#Zf0wrN zu6TOkFZ=gjJjuTcm(KCjk^hAK>C5YdIyI{$cWoqfMlL1$YfU)kmI<32RjT6MF-^1+ zu5kT!+}6TSU4}rkzxjUEcG~Kh@Abq!T=YzkyG2;oZEw_CmLg{03N}xbxl|$A;tcpT zpbr(q-$H!|0qy_r76FQ8V#m<0Y*(Fkz&n0WOwcDKdzTK*QthE0?m{QOJlSc7rO;n1 zYR_}1E~pwB&WP{^97CP2Adi_P)T4L-3$t~jcvbVWMpqD$W9ZV}#f=-#BI~)WBzIKf zp~KK{KqR)o&@gENNEVYq4-FkTN-1!(uEg9aIR6;}s?gcgJE|dn<=dU13-3wI@$5sD zs|4$N2@ZO+7D&ul{dQ4qn?KTU5=FTzATOKhqq9F|9K9@bJN<3BM=d+yT-~?LEOI2;h>Rb2VP6t<-cT^v98g95^jz{7T)Y3kdO5^f%pW$w5WQ zq5d2o@&_~V;}`_zPng|Z$$=@!A&beu0qCHrLH~XOv29c+RdN_y06%QgnJkdn1wXo< zQ-EM#(<}W4o(rx@KcmhM4HpuX0b&6>z@~kAu$v3T_yAHPHsPk3L6D*gG26h$MqG54 zkLCTm1ka8|%VKtmVg-fsn?5T)NUPrSn{qmW`dJ%4Hf(yV1PZ$lo?4wX|Jawi*)UoO zd$@Q*(JSdi1iU8iGuH_kP+LEfhXAHB{g5YejBZ7YIwQPL*|$Ho{+>T?4gp<-FKh8H zXzA%QuJ!8cgf?7YuJ!qPQBrP5`u*H3G=JfQ>Xi2u+7X2$iI&D- zR8sME_b(u(nQ_}kvsTj9OHj&~f9N-}vk!JzAXqjPsUN^xz`?7;^XO+w{$*H2N@wbc z{u0B!T5#G`&~CD6Y}rVYvcvVz+A6mO!t*tCQtJAy)FYN0?T>I&>U?xOAXK4#+t5io zy^Andam6%$jt2ii_A{8X=d;9ob3T_Yl;BBG&5ofb&5O`!MjX9{6Xl6Ot!1H1nYzpe zv+CDBFoLhP)b&|Vz&83keTtu?N6hjSC5T&5skV^jdUquw7VEaRQc#SjP_-oJBRoIy$#+6PFGZfzVhHz8DzxsqtCy;3d?D zk*#O9vAdNptSOWE5FXu(t-WarG6=RC^A#R~8Oy#fT_u7%hJ4~wA*9aK1etgM0&q~Abl`FMan23 z$?ft)HjvUY7hi%EXM;{v1VS zgZ{k7Ho~r0KsPb5)RIK54 zIbSB&XsE1-Y^M%EXzdCfE|Z6V6?N0=Gux@FVMF!cyfkUT=LK3``8bwluVTe+c^{qY zwRcHUf3EXx%vehurUpEaj4y)bVUfKI5o|AIiqJ}X_J{z^Ia;8+deM=&sJ+RQ<|tcx z8|{HAp5aUA^%+QVbug!+_3W~L$G<4eM8iIGtO}{V_MqZgI|KFaEz}x%yzFDhOJS7nWE<*Gh4=0~dqIfD77mURF5ZB-c*)hiC6V8# zY%u#=JLTT;g|V&nTi+!5DhPJOL(+KQvr9)2+QRADO4hEhA^4QQxN&_}^Z=}yVSjPt ziRjZ$_|#i>BXL6CR_4DS&!%cxWIESAAM)k3$}!Eb-2W2>?CGC=_eF4d9lK&w&S}__ z%Nxwzub@P1GLa&b8Biqc$|y#wLN|HG2sg(J?(=rJV)cRGIBt9K$Ad-2)~Jyh&H-G? zfEn5VAC=19{fT#?crSE~0J^80R=cr$ATA7B@!q?~S=n=c7`!vrCBJ zAIHz`2LDE8#kfsv$d#TsQz)x53{gmmp#gs_137S!3~cBqro4!k?+f^h=TOApIe%8E z{;NrCI5Bjct|*Fx?p&O2pLuexlsn-EJuJMf^hnI zx3{86>Lo9q4I&l4m5n$z~KvpdN3V=eE2 zfg0cPo8dTio2^9Zv+T;lT-p-q%Cgr&msxjvc;<_VM}!pNHwT@b8JADHZ0q4I&itoc zZH-vB+iw-y+?QE_f9ej~$h&(IeQF?e6xo_*H$)VDxQb=(j|CI&|J{FZB~#sySA6<@ ze5q0T6@2j_v%e8G2g@o2=8!>H|_k)Z5*gq)SYw{)<=Z>Vkj%o#JA`_q=RlH z5pu!sj#&iK}C?RHbFT(=yV{G=Fz~<}3R`aWgJd)#f`>iK20IMy3hUJ)YXG z#U%|%sX5V(ObiwEfn%@=*_SH_tm-Xaugt>2^l#bbXXOJ>Y%?QY&)&j2eKTgoWlv^- z3BlR{)}tQl$S$3unLA2@lJWYaGLWkMxzcKZWa-GVNqT-kz&fo^k5PeR*u}!y^utRR z?C=YiG*K+i$Ig?cNj}5mFt=m-Qe~&1NZ6cE=|5X!8ePH=lwo?NcOT@0vIe-n>|As7 zr^Le2`?!1W-VoVQxNrOVRKK5)7r~#aopk@wVnhl3lr#n5%3yki>!lhLQ{r0%ksNtk z#!b4WV=PeluPaQ1$BY?Hxcg}7?6I2}eJMC_;N&ep>QArX1yRZ|g(V1dwI7bw++;j)znW z8DQM6nmaOP(5{0tVg^tXVKLMOM^bv?>Z;vCiLesmmN~}Sfa+55?;R8G;wBPLq=6GHD6uKeU`+AB~ zjFNCeVuVr7)t_LBzT1`HgU66roL-_v;|#5$9M3zJK1)y|nf8VPOKrL`$X&6_tVk%a zro(4KS6MyA2cx_$JubK$NM1(5Ik$~G()4#zkAHe8x%t1qscWop)^+%KCvmA?okYKW z8*`*+Wlzs@x_HVeY1i+rd$+k^W!klUwvX0VPEU9IRak%pN2E>Dgt_D zEiPXQ+V!g&r$v#|)1d4Q_9BYW83(T;%HC}l=Z;dshgpGt^Lf}3HaJBbpOG7aMg0v8 zC-C;13^$?juUa|%IB?WF zS5S-jZ|?4f%yV94ZF$@(GS9g6yc`tL(P)mpv56r#n*}Ky%&GUBnS<$)w4K1 zP+nl@J@kF4WmC4eYnhRrtiB_JI|)KZtVkZNrZeE0mhR?%eLHgjfmMp}b%rLAK6JzE zr6$4?)6VB;qvYu{_`CisjJgWbf||s}4mC`gh60c5MwH3VE(sQ#mlATbYARhV1IN>&uPv`O{-%uAM{7 zMdH5USsdmy*vT7X+HgA7f)n`8qkBA1%+nCecCD+B@xPe#IB;m;|H7Y%^VK!J3GPOg zf{02H z{r@Ej;Y+@!wf{pEY$s9zxe?B8f_)o=G%6ZeH$mcVL-uh| zkR|=SoSP^l0ZPIxT!WwYH%Zy;mj39>&a~wc4x6)$$n!b%%df1#hhDl7HNu74v8${R zqhVWR#nhX+zj-2m-OGA$wQ=B*PSm|j$lS5Mm9gN}Z0r$?Fc}WI*_oGTI_DJYQqXfUVI1Q23#=G&Qt#+tdQ=LCfT4`ztOactJ0aB5 zvgbO6om5fVy0=An$_behLK=ONnn~>(Wke$$DPUyjuLAdH8tk1RjYL3v@y;-sk*Ytu zM5d`{1_7xT4s1J-N;-08+t1X{=gxRMDFF95ey;?dJYETb-vkF&Ct`h}}Q*V7s z_`cRel_-LC=d5UcgEtyKLs;yO0qx>Y_1IvEjvIMvxHiao_709CenG)k6KYs$$^i%5 zSNsEMU)DncCyd+x&YAUACeGLBJ1`v&(J~6XD9hQUxARv_J=Pdq-#(ZxMzNG!m{NIT zT{5 zZ+ou|x;(7cn9t%xJ39Y8#u=#Pf79GLhnwi5*dA%1?~2xR6A##d9U4omrHa|<0@(FP zO(gY`s)N(3HSL>O7$c5T0@eq8+Zl-f|GrmM|78Z|<2`7A#6b!i}weArkHRIF4uI7)s*2<&rxJ56Uvs%jRh^R5g!qm4nf7gKwWWg$!6O;qQn_c2SKxt~egM2G0M{;D+ z)xo?aFUprwkOsAyPh$WkYjR1$@QI6$P2*olX2mPV)fN)wTwWK}pQFOV@S+{Oq8YV^ znDz^K$USmc)_6gD(ZHsC4Sn~_Kw?kE@RyR;7Z%SV)vl1&A1d5jMivOGQwxEW2zuFe0im758RqZbRbGkJ;_J8dWSUOke zGJ<0Vd>Ti;g>iY$mL$p+wGB&Sgt#6192zrPacqx$l-q;zNN+kbcZ7lqvaCMY?4%0b zcC`z<0q&fF`bA4$$l)UCs^v|??+hZBDsI%+`*sUC{lsAkklXSpRe%n8Q!2gEmnd_* zAzruSe&Vm5tUTg^N|YI~fSF>^&G!{KqD-le*x^>&vKK^fhx@##Vh8QANVDccDR$udN7&~ zm!X3TLIbbKVgO!-8Mza=r`&&YZ?1552#W@)kxzOg2kXG#zVgs4C(ao@WMyr-TE2G}K2}$2(?bz*?#F+(l=aN5S3`vd zovOw`Q`hTKSJx-g zHLluFAkF6Ih~T)R@g7CL9wAscPtEMdZ-U{cUe{m7u$T)UOvE9?QoeoWP=nTAByjLI zc9}6bZ4;`pgu(|b64d$Jav%2>Q(;@4Mul=viCUd4+imD063q8;Pz#n-?rF5e9QPiQ z@#ko#`6bIg3m!P`80U5ZO=ebN!7uFkp zx$(3$ET_Gt z-A~An{9%xK2uN@=K;o{Vny={wQ@$ov;CjouexQ1!2C*)ENCc{RlJbD(Ge&`h%v;D1 zeYM-1I;&Mc@_!;&P2<_TYPT35_l|tNvgV1&pBBuH^eMs0E@EsFQIBJS zn|~-%^Zb1}UF?g)D$fHDh$5NQR|CuXpWO!l_rH41>SY@-r|NkcqJ0BQ5EsUB69A2+ z0jej8dbV%bHlGd*>pt5^o|u!`jzZp(4KPDf8_?;@wDp$Fgds3jPbH8{)XRz5wg)Hl z*$4&V|7Nvpx~}z9#9ek(QtoR8uRClhTxvV-^eiOK^Iv)3>lb(ap8y#J=K8x(KjCxf zZxbctiPXobkD%rcy2ql=*bPskzO}QccdN68<~$=w^v?D7muS?M*JvM)9k3&IrZpLL z<)wF?Bd?;TmxuTgio_4kf!)}T>QGe(UJx=S+`e@CM3jA@SK z$6VC)h3>T)iS9o%CD$ESU9Ib{NO|OXtx9}Eu6ql;SWhUqMm&9k8e@mya2$anE${N# z;CZSn_*_HYqhAJnaoybm-^J5I2dQ_X=JtC~bJy#57&XH`fLcnk?&GLAx&97#3`Tj2Cc%MeCE3EhU0juyMe!|c64}3@8 z?9X>p$_Q4=dx1HYo*M!O5L;YUaXCJ-ZKj8e_&m#hfT2oHpE8Q z7@J@;HpAxF0$XA$^kE#vU@W%AHW-g>u^sA(LOti+5xZalcEZk>h`q2YcEcp>j(WyZ z&vo|1H0+Hjn2H(L2h*`H>iNz7sAo0@;vgK1IjCndvoITnq966F^8pn3y zKHQJ`eW0EZ(Ee76NAWP8#$$LKPvS*9gXd6BmtVpws8Q$xf8N8JScZ470`KEPe1VU# z5})CFe2K47ziF?JM)DCqTi!pla!;t~DYHn_^JRL1OushQZ^-qlY(2x(0-Itq#$gQV zSx!Aeq+eynVtFq5e^}4d=vkPlI2~u=BAkQsP|w2X306JHvILjodMw1%xE8nI1}ws2+>LrZ zWjpE@u-e*sKJ*akdDsJZ91r7B)YGYYj`cL^Y14Cf0WYDRl+<$>dfHS^j6T3Jyn}l7 zQ_pNZLOpk>XEyaq%P49+BdI4Y^?c^k*MD*#-W~g z)o&5&V++)84x3;zjK(&&9n(<1)@z6Q4PFBFz(h>KR7}QRI0^@1AMA_$QNM^Ag!=7V zKI&I+LvSPx$Avfn$KW{B@60FR6x1)%rr`qAFVp6temlJa^(%4x4tyD|!IfBqYjFc^ z#Z8v?f2*Ga=LY{dCg^W|6!dpL4Ep=oLI3xD&_C7<`hO)szy5K+{E)JsVW-^pSYr7# z<6OPl@}us!`lRL8spaZDmfyF;)n_cfUnf`Zwfq^4U41@KpLO*<%P;u>7kDuD%hdx4HVD(hu5k4s%m49SSKkTLU%L9R<$wLr z)%R_vC(+eMY-nWl>psGxfh4%ChDId@9pv+P{vQ`UXl0k?Q%)ZXI5#sh3MC~)PeuwD CE%uNA delta 149025 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