R avancé et introduction à Git

Raphaël Nedellec

Programmation littéraire et science reproductible

Avoir un ‘workflow’ de datascience reproductible

  • Pouvoir expliquer et reproduire ses résultats aujourd’hui comme dans N jours/mois/années.
  • En datascience, il est aussi important de s’adresser correctement à ses collègues qu’à sa machine.
  • Avoir un workflow efficace lorsque les calculs et les processus sont compliqués.
  • Pouvoir travailler de manière collaborative.

Agenda

  • Programmation littéraire avec quarto
  • Simplification du workflow et reproductibilité avec targets
  • Gestion des dépendances avec renv
  • Version control : git au prochain cours !

Programmation littéraire avec quarto

Programmation littéraire

Let us change our traditional attitude to the construction of programs: Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to human beings what we want a computer to do.

Donald Knuth

Motivation originelle de Yuhie Xie (créateur de knitr/rmarkdown)

Programmation littéraire pour la datascience

  • Reproductibilité des résultats
  • Explications, codes et résultats dans le même document

Un outil et une méthode précieuse pour rendre intelligibles et reproductibles ses études. Un gain précieux en efficacité.

Outils

Notebook (jupyter), Rmarkdown, Quarto

rmarkdown

Un peu d’histoire

  • Engine knitr (2011), avec des dialectes , markdown
  • rmarkdown (2015)
  • Et désormais, quarto (2022)

Histoire de rmarkdown par l’auteur de la librairie

rmarkdown vs quarto

  • quarto reprend la philosophie de rmarkdown
  • mais est agnostique au langage (compatible R, python, …)
  • les fichiers .rmd peuvent être compilés avec quarto (pour la plupart)
  • aujourd’hui, sauf exceptions, privilégier quarto

Vignettes

Le CRAN ne supporte pas (encore) les vignettes générées par quarto aujourd’hui. C’est un des rares cas où privilégier rmarkdown.

rmarkdown vs quarto

Avec quarto :

```{r}
#| eval: false
#| label: chunk-quarto

1 + 1
```

Avec rmarkdown :

```{r chunk-rmarkdown, eval=FALSE}
1 + 1
```

Paramètres du ‘bloc’ dans les accolades en rmarkdown, après #| en quarto.

quarto

Metadata du document : YAML

---
title: "first quarto"
author: "Raphaël Nedellec"
date: "27/01/2023"
format: 
  html:
    code-fold: true
---

Multiples formats : html, PDF, MS Word, OpenOffice, ePub, Revealjs, PowerPoint, Beamer, et de nombreux autres

quarto : project

Documents, présentations, mais aussi ‘websites’ ou ‘books’

---
project:
  type: website
website:
  title: R Manuals
  navbar:
    background: primary
  ...
---

Exemple : ce cours est hébergé sur un site quarto. Les slides des cours sont aussi écrites en quarto avec revealjs, les sujets d’exercices en quarto - pdf.

quarto : ‘code chunk’ R

```{r}
#| label: fig-airquality-unfolded
#| fig-cap: Temperature and ozone level.
#| warning: false
#| code-fold: false
#| eval: false

library(ggplot2)

ggplot(airquality, aes(Temp, Ozone)) + 
  geom_point() + 
  geom_smooth(method = "loess")
```

quarto : ‘code chunk’ R

Code
```{r}
#| label: fig-airquality-folded
#| fig-cap: Temperature and ozone level.
#| warning: false
#| code-fold: true
#| eval: true

library(ggplot2)

ggplot(airquality, aes(Temp, Ozone)) + 
  geom_point() + 
  geom_smooth(method = "loess")
```

Figure 1: Temperature and ozone level.

quarto : ‘code chunk’ R

#| echo: true/false/fenced
#| eval: true/false
#| warning: true/false
#| error: true/false
#| label: "my-chunk"
#| fig-*: ...
#| tab-*: ...

Liste complète des options de blocs de code avec knitr disponible ici

quarto : aussi en Python

  • Tout comme rmarkdown, les blocs de code ne sont pas nécessairement en R.
  • Autres langages : Python, R, Julia, Observable.js
  • Quarto, à la différence de rmarkdown, est totalement agnostique envers le langage. C’est un outil aussi très utile en Python !

quarto en résumé

  • Programmation littéraire.
  • Document auto-portant avec texte, code et résultats réunis.
  • Hautement configurable, multiples formats de projets disponibles.
  • Templates et thèmes customisables.

quarto

À utiliser aussi souvent que possible pour une analyse de données ou un projet de datascience.

Mais alors, quand utiliser des fichiers .R ?

  • pour définir des fonctions, dans des packages
  • avec parcimonie, pour sourcer des fonctions (source())
  • lorsque l’on écrit un vrai script à appeler en ligne de commande avec Rscript

Gestion des dépendances avec renv

Information de la session

devtools::session_info() # alternative à sessionInfo()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.3.0 (2023-04-21)
#>  os       macOS 14.3
#>  system   aarch64, darwin20
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    UTF-8
#>  tz       Europe/Paris
#>  date     2024-02-07
#>  pandoc   3.1.1 @ /Applications/quarto/bin/tools/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  ! package     * version date (UTC) lib source
#>  P cachem        1.0.8   2023-05-01 [?] CRAN (R 4.3.0)
#>  P cli           3.6.2   2023-12-11 [?] RSPM (R 4.3.0)
#>  P colorspace    2.1-0   2023-01-23 [?] CRAN (R 4.3.0)
#>  P devtools      2.4.5   2022-10-11 [?] CRAN (R 4.3.0)
#>  P digest        0.6.34  2024-01-11 [?] RSPM (R 4.3.0)
#>  P dplyr         1.1.4   2023-11-17 [?] RSPM (R 4.3.0)
#>  P ellipsis      0.3.2   2021-04-29 [?] CRAN (R 4.3.0)
#>  P evaluate      0.23    2023-11-01 [?] CRAN (R 4.3.1)
#>  P fansi         1.0.6   2023-12-08 [?] RSPM (R 4.3.0)
#>  P farver        2.1.1   2022-07-06 [?] CRAN (R 4.3.0)
#>  P fastmap       1.1.1   2023-02-24 [?] CRAN (R 4.3.0)
#>  P fs            1.6.3   2023-07-20 [?] CRAN (R 4.3.0)
#>  P generics      0.1.3   2022-07-05 [?] CRAN (R 4.3.0)
#>  P ggplot2     * 3.4.4   2023-10-12 [?] CRAN (R 4.3.1)
#>  P glue          1.7.0   2024-01-09 [?] RSPM (R 4.3.0)
#>  P gtable        0.3.4   2023-08-21 [?] CRAN (R 4.3.0)
#>  P htmltools     0.5.7   2023-11-03 [?] CRAN (R 4.3.1)
#>  P htmlwidgets   1.6.4   2023-12-06 [?] CRAN (R 4.3.1)
#>  P httpuv        1.6.14  2024-01-26 [?] CRAN (R 4.3.1)
#>  P jsonlite      1.8.8   2023-12-04 [?] RSPM (R 4.3.0)
#>  P knitr         1.45    2023-10-30 [?] CRAN (R 4.3.1)
#>  P labeling      0.4.3   2023-08-29 [?] CRAN (R 4.3.0)
#>  P later         1.3.2   2023-12-06 [?] CRAN (R 4.3.1)
#>  P lattice       0.22-5  2023-10-24 [?] CRAN (R 4.3.1)
#>  P lifecycle     1.0.4   2023-11-07 [?] CRAN (R 4.3.0)
#>  P magrittr      2.0.3   2022-03-30 [?] CRAN (R 4.3.0)
#>  P Matrix        1.6-5   2024-01-11 [?] CRAN (R 4.3.1)
#>  P memoise       2.0.1   2021-11-26 [?] CRAN (R 4.3.0)
#>  P mgcv          1.9-1   2023-12-21 [?] CRAN (R 4.3.1)
#>  P mime          0.12    2021-09-28 [?] CRAN (R 4.3.0)
#>  P miniUI        0.1.1.1 2018-05-18 [?] CRAN (R 4.3.0)
#>  P munsell       0.5.0   2018-06-12 [?] CRAN (R 4.3.0)
#>  P nlme          3.1-164 2023-11-27 [?] CRAN (R 4.3.1)
#>  P pillar        1.9.0   2023-03-22 [?] CRAN (R 4.3.0)
#>    pkgbuild      1.4.3   2023-12-10 [1] CRAN (R 4.3.1)
#>  P pkgconfig     2.0.3   2019-09-22 [?] CRAN (R 4.3.0)
#>    pkgload       1.3.4   2024-01-16 [1] CRAN (R 4.3.1)
#>  P profvis       0.3.8   2023-05-02 [?] CRAN (R 4.3.0)
#>  P promises      1.2.1   2023-08-10 [?] CRAN (R 4.3.0)
#>    purrr         1.0.2   2023-08-10 [1] CRAN (R 4.3.0)
#>  P R6            2.5.1   2021-08-19 [?] CRAN (R 4.3.0)
#>  P Rcpp          1.0.12  2024-01-09 [?] CRAN (R 4.3.1)
#>    remotes       2.4.2.1 2023-07-18 [1] CRAN (R 4.3.0)
#>    renv          1.0.3   2023-09-19 [1] CRAN (R 4.3.1)
#>  P rlang         1.1.3   2024-01-10 [?] RSPM (R 4.3.0)
#>  P rmarkdown     2.25    2023-09-18 [?] CRAN (R 4.3.1)
#>  P scales        1.3.0   2023-11-28 [?] CRAN (R 4.3.1)
#>  P sessioninfo   1.2.2   2021-12-06 [?] CRAN (R 4.3.0)
#>  P shiny         1.8.0   2023-11-17 [?] CRAN (R 4.3.1)
#>  P stringi       1.8.3   2023-12-11 [?] RSPM (R 4.3.0)
#>  P stringr       1.5.1   2023-11-14 [?] CRAN (R 4.3.0)
#>  P tibble        3.2.1   2023-03-20 [?] CRAN (R 4.3.0)
#>  P tidyselect    1.2.0   2022-10-10 [?] CRAN (R 4.3.0)
#>  P urlchecker    1.0.1   2021-11-30 [?] CRAN (R 4.3.0)
#>  P usethis       2.2.2   2023-07-06 [?] CRAN (R 4.3.0)
#>  P utf8          1.2.4   2023-10-22 [?] CRAN (R 4.3.1)
#>  P vctrs         0.6.5   2023-12-01 [?] RSPM (R 4.3.0)
#>  P withr         3.0.0   2024-01-16 [?] RSPM (R 4.3.0)
#>  P xfun          0.41    2023-11-01 [?] CRAN (R 4.3.1)
#>  P xtable        1.8-4   2019-04-21 [?] CRAN (R 4.3.0)
#>  P yaml          2.3.8   2023-12-11 [?] RSPM (R 4.3.0)
#> 
#>  [1] /Users/mac-RNEDEL22/Documents/Perso/Projets/r-advanced-git/renv/library/R-4.3/aarch64-apple-darwin20
#>  [2] /Users/mac-RNEDEL22/Library/Caches/org.R-project.R/R/renv/sandbox/R-4.3/aarch64-apple-darwin20/ac5c2659
#> 
#>  P ── Loaded and on-disk path mismatch.
#> 
#> ──────────────────────────────────────────────────────────────────────────────

Reproductibilité

Pour s’assurer de la reproductibilité, il faut pouvoir reproduire son environnement :

  • Savoir quelle version de R a été utilisée
  • Savoir quelles librairies ont été appelées, et quelle était leur version
  • Pouvoir reconstruire cet environnement

Un outil : renv

renv

  • Librairie renv
  • Philosophie : isoler les dépendances d’un projet pour le rendre reproductible dans le temps
  • Management local des dépendances et des environnements
  • Similaire à venv en Python

.libPaths()

L’utilisation de renv facilite la gestion des versions et la configurations des libPaths()…

renv : workflow

  • renv::init() : pour initialiser un projet avec renv
  • renv::snapshot() : sauvegarder les références aux dépendances dans un fichier renv.lock
  • renv::restore() : pour retourner à l’état référencé dans le fichier renv.lock

Limites

renv : avantages

  • Gestion globale d’un cache : optimisation d’espace disque et de temps de sauvegarde
  • Possible d’utiliser des versions différentes de librairies dans différents projets sans avoir à configurer manuellement les .libPaths()
  • Facilite la collaboration

En résumé

En résumé

  1. quarto : programmation littéraire. Utile pour les rapports, blogs, EDA… Et pour vous faire un ‘portfolio’ facilement !
  2. renv : gestion de l’environnement, un point essentiel de la reproductibilité des résultats

Annexes

Liens complémentaires

  • documentation quarto Documentation officielle quarto.
  • renv Documentation du package renv, avec beaucoup d’articles explicatifs.