library(dplyr) # manip. données
library(ggplot2) # graphiques
library(sf) # carto.
library(leaflet) # carto.
library(gt) # formatage tableaux
# un theme ggplot utilisant la typographie Marianne
<- function(...) {
theme_masa theme_grey(...) %+replace%
theme(
text = element_text(family = "Marianne"))
}
Formation Quarto
Parcours de formation R perfectionnement SSP
Pré-requis techniques
- Quarto (≥ 1.5)
- RStudio (≥ 2022.07) et R (≥ 4)
La police Marianne doit être installée sur le poste
Introduction
DIAPORAMA EN COURS DE CONSTRUCTION
Un module des formations à R dispensées au MASA
Objectifs
- Intérêt des publications reproductibles
- Découvrir la versatilité de Quarto
- Réaliser un document, de simple à complexe
versatile : pour le langage en entrée et les formats en sortie (diapo suivante)
Quarto
Un système de publication

- Mélange code et texte : une partie du document est générée par des données (tableaux, graphiques ou texte)
- Successeur de Rmarkdown
- Commandes complémentaires LaTeX ou Typst pour le PDF
- Pandoc est un convertisseur “universel” de formats de texte
Formats/moteurs
- multi-format
- HTML (rapports, livres, présentations)
- Appli web (statique/Shiny) : blog, site, tableau de bord
- Powerpoint
- MS Word
- multi-langage
- R
- Python
- Observable
- Julia
Le format PDF nécessite {tinytex}
Avantages
- intégration avec R
- reproductibilité
- session vierge à chaque génération
- limiter les copier/coller entre outils
- prise en compte des changements de données ou de méthodes
- interactivité possible dans le document (HTML)
- versionnement avec git
- afficher du code dans le doc
- éviter les copier/coller : synchronisation analyse/résultats
- faciliter la reproductibilité avec {renv}
Inconvénients
- syntaxe (markdown)
- génération active du rendu pour visualiser
- débogage parfois plus complexe
- Mais disponibilité d’un éditeur visuel What You See Is What You Mean dans RStudio.
- Asynchrone
Sur CERISE
Un paquet {quarto} et un binaire quarto
(ils sont pré-installés sur CERISE).
Vérification dans le terminal :
quarto check install
quarto check knitr
install.packages("quarto")
Le format PDF nécessite LaTeX.
quarto install tinytex
- Le programme est livré avec RStudio (mais peut être installé à part aussi)
- La paquet n’est pas indispensable mais peut être utile
- Typst n’est pas encore disponible sur CERISE (sauf en pré-prod) pour générer du PDF sans LaTeX
Structure et syntaxe
On passe en revue rapidement les éléments d’un document Quarto, puis on revient sur chaque éléments en détail par la suite
---
title: "Litany against fear"
author: "Bene Gesserit"
---
I must not fear. *Fear is the mind-killer*. Fear is the little-death that
brings total obliteration.
```{python}
import numpy as np
np.exp(np.pi * complex(0, 1)) + 1
```
**I will face my fear.** I will permit it to pass over me and through me.
```{r}
somme <- sum(1:10)
```
`{r} somme` inner eye to see its
And when it has gone past I will turn the
path. Where the fear has gone there will be nothing.
> Only I will remain.
Un exemple pour montrer rapidement les différents éléments qu’on décrira ci-après
markdown
Un langage balisé simplifié
Inventé en 2004 pour offrir une syntaxe facile à lire et à écrire, en l’état, sans formatage.
chunks
Le code exécutable est intégré dans un chunk (bloc) :
```{r}
#| label: mon-chunk
#| warning: false
1+1
```
Ctrl Alt i
- détails dans la partie Code
- Triple quote + le langage dans des accolades
- Les commentaires/pipe permettent de préciser des options (la plus grosse différence visible entre Rmarkdown et Quarto)
label:
est un identifiant (facultatif mais conseillé)
En-tête de configuration
- YAML
- bloc entre
---
- Facultatif mais a minima :
title:
,author:
,date:
,format:
- options nombreuses et variables selon les formats
Rendu
(knit)
quarto render mon_document.qmd
Ctrl ⇧ k ou (ou
)
Le tricotage/rendu se fait dans une nouvelle session à chaque fois et n’impacte pas votre environnement courant ; de même les objets de votre environnement courant ne sont pas disponibles, par défaut, lors du rendu
Exercice 1. : découvrir l’interface
Éléments
Texte
- 2 retours à la ligne pour faire un paragraphe
- 2 espaces et 1 retour à la ligne pour un saut de ligne
*
ou_
pour mettre en *italique* ou en **gras**[un lien](https://www.example.org/)
→ un lien- une portion de texte peut être stylée en vert avec
[vert]{style="color:darkgreen"}
- mais du HTML est aussi possible
<span style="color:red">rouge</span>
pour mettre en rouge
Titres
Préfixer le titre avec #
, ##
ou ###
pour avoir les titres de niveau 1, 2 ou 3, etc..
#### Titre de niveau 4
Titre de niveau 4
Listes
- Atréides
- Leto
- Jessica
- Paul
- Harkonnen
- Vladimir
- Rabban
- Feyd-Rautha
ou
- Atréides
* Leto
* Jessica
* Paul
- Harkonnen
+ Vladimir
+ Rabban
+ Feyd-Rautha
- Atréides
- Leto
- Jessica
- Paul
- Harkonnen
- Vladimir
- Rabban
- Feyd-Rautha
1. Atréides
- Leto
- Jessica\
`\`) + nouvelle ligne + aligner
**2 espaces (ou
pour ajouter du texte dans les items** - Paul
2. Harkonnen
- Vladimir
- Rabban
- Feyd-Rautha
- Atréides
- Leto
- Jessica
2 espaces (ou\
) + nouvelle ligne + aligner pour ajouter du texte dans les items - Paul
- Harkonnen
- Vladimir
- Rabban
- Feyd-Rautha
Renumérotation automatique incrémentée à partir du premier numéro trouvé.
Liens
[Texte du lien](https://fr.wikipedia.org/wiki/Arrakis)
Images


{#fig-dune fig-alt="A sand worm on Arrakis"}
Utiliser le préfixe fig-
pour l’identifiant afin de pouvoir bénéficier des renvois automatiques et de la numérotation automatique
Renvois
(cross-references)
Un lien automatique est créé si on indique @fig-dune
: Quarto nous écrit le lien (type et numéro) qui renvoie à figure 2.
Les noms des types affichés peuvent être modifiés dans l’en-tête :
---
crossref:
fig-prefix: figure # par défaut : Figure
fig-title: Figure
tbl-prefix: tableau # par défaut : Tableau
tbl-title: Tableau
title-delim: " – "
---
Notes de pied de page
Les notes se construisent en ajoutant un [^1]
dans le texte, avec le 1
pouvant être une numérotation (pas obligatoirement dans l’ordre) ou tout autre mot clé. La note est ensuite introduite avec le même symbole dans un nouveau paragraphe :
[^1]: texte de la note
C’est normalement facile1 à faire si on se rappelle de la syntaxe.
Équations
Syntaxe LaTeX entre des $
(inline) ou $$
(bloc).
$\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2},\text{ où } \mu = \frac{1}{N} \sum_{i=1}^N x_i$
\[\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2},\text{ où } \mu = \frac{1}{N} \sum_{i=1}^N x_i\] doc
Citations/bibliographie
Avec Zotero et l’extension Better BibTeX pour auto-exporter en BibTeX la collection quand elle est modifiée.
Préciser le fichier utilisé en en-tête, puis utilisation des identifiants du fichier BibTex.
---
title: "Mon document"
bibliography: formation_quarto.bib
---
Comme le dit @rdevelopmentcoreteamLanguageEnvironmentStatistical2010 :
> Lorem ipsum dolor sit amet[@rstudioGuide2024], consectetur adipiscing elit
Comme le dit R Development Core Team (2010) :
Lorem ipsum dolor sit amet (RStudio, 2024a), consectetur adipiscing elit
La bibliographie est directement générée :
en fin de document ou
après un <div> identifié avec #refs ex. :
## Références ::: {#refs} :::
Libellés
(Callout)
Les “libellés” permettent de mettre en exergue des informations complémentaires.
:::{.callout-note}
Il existe cinq types de libellés : `note`, `tip`, `warning`, `caution` et `important`.
:::
Il existe cinq types de libellés : note
, tip
, warning
, caution
et important
.
::: callout-warning
Suite aux nombreux manquements à l’obligation de contrôle hebdomadaire (...) :::
Suite aux nombreux manquements à l’obligation de contrôle hebdomadaire de l’étanchéité des colonnettes à crémaillère (…)
::: callout-warning#### Attention
Le caisson de calibrage de la bride du commutateur à fuseaux (...) :::
Le caisson de calibrage de la bride du commutateur à fuseaux rotatifs est HORS-SERVICE
Exercice 2. produire un document simple
Code
|>
iris glm(Sepal.Length ~ Sepal.Width, data = _)
Call: glm(formula = Sepal.Length ~ Sepal.Width, data = iris)
Coefficients:
(Intercept) Sepal.Width
6.5262 -0.2234
Degrees of Freedom: 149 Total (i.e. Null); 148 Residual
Null Deviance: 102.2
Residual Deviance: 100.8 AIC: 372
Options de bloc de code
- exécution :
#| eval:
exécuter le code#| echo:
afficher le code- nommage :
#| label:
identifiant du chunk#| fig-cap:
légende du bloc
Outils
Si on a #| echo: true
l’utilisateur voit le code
On peut aussi ajouter des outils pour l’utilisateur pour qu’il affiche ou cache les chunks avec, dans l’en-tête YAML :
format:
html:
code-fold: true
code-tools: true
Sorties de code
- texte, avec :
#| results: markup
oucat()
et#| results: asis
- tableaux
- images
- éléments interactifs
Exercice 3. Code
Tableaux
Les tableaux sont balisés ainsi en Markdown :
| année | titre |
|------:|:------------------------|
| 1965 | Dune |
| 1969 | Le Messie de Dune |
| 1976 | Les Enfants de Dune |
| 1981 | L'Empereur-Dieu de Dune |
| 1984 | Les Hérétiques de Dune |
| 1985 | La Maison des mères |
: Cycle de Dune {#tbl-cycle}
année | titre |
---|---|
1965 | Dune |
1969 | Le Messie de Dune |
1976 | Les Enfants de Dune |
1981 | L’Empereur-Dieu de Dune |
1984 | Les Hérétiques de Dune |
1985 | La Maison des mères |
Mais la plupart du temps on affichera des tableaux programmatiquement.
|>
iris summarise(.by = Species,
moy_sepales = sum(Sepal.Length))
Species moy_sepales
1 setosa 250.3
2 versicolor 296.8
3 virginica 329.4
Avec {knitr} ou le paramètre en en-tête :
format:
html:
df-print: kable
|>
iris summarise(.by = Species,
moy_sepales = sum(Sepal.Length)) |>
::kable() knitr
Species | moy_sepales |
---|---|
setosa | 250.3 |
versicolor | 296.8 |
virginica | 329.4 |
Contrôler l’impression de data.frame avec df-print: kable
ou df-print: paged
, df-print: tibble
Interactivité javascript df-print: paged
à voir en exercice
ou avec {gt}
|>
iris summarise(.by = Species,
moy_sepales = sum(Sepal.Length)) |>
gt()
Species | moy_sepales |
---|---|
setosa | 250.3 |
versicolor | 296.8 |
virginica | 329.4 |
Utiliser le préfixe tbl-
pour l’identifiant afin de pouvoir bénéficier des renvois automatiques et la numérotation automatique
Exercice 4. Tableaux
Graphiques
ggplot(iris, aes(Petal.Length,
Petal.Width, color = Species)) +
geom_point() +
theme_masa()

Taille d’image dans Quarto (Arel-Bundock, 2024)
Interactivité possible avec {plotly} ou {ggiraph}. cf. exercices
Exercice 5. Graphiques
Cartes
"~/CERISE/03-Espace-de-Diffusion/000_Referentiels/0040_Geo/IGN/adminexpress/adminexpress_cog_simpl_000_2024.gpkg" |>
read_sf(layer = "region") |>
leaflet() |>
addTiles() |>
addPolygons()
Exercice 6. Cartes
Diagrammes
- Mermaid
- À construire avec mermaid.live
flowchart TD
A[(données)] --> B(importer)
B --> C[/données valides/]
C --> D{"sum(sau > 200)"}
D -- oui --> E(OK) D -- non --> F(Stop)
flowchart TD A[(données)] --> B(importer) B --> C[/données valides/] C --> D{"sum(sau > 200)"} D -- oui --> E(OK) D -- non --> F(Stop)
Fonctionnalités avancées
Rapports paramétrés
mon_document.qmd
---
title: Rapport
format:
html: default
param:
region: 84
sortie: knitr
---
## Région `{r} params$region`
```{r}
sau <- ra |>
filter(siege_reg == params$region) |>
summarise(.by = siege_dep,
sau_tot = sum(sau_tot, na.rm = TRUE))
if (params$sortie == "knitr") kable::knitr(sau) else sau
```
On n’est pas obligé de changer manuellement les paramètres et re-tricoter ; on peut itérer sur une liste :
for (r in c(11, 94, 84, 04)) {
::quarto_render("mon_document.qmd",
quartoexecute_params = list(region = r),
output_file = paste0("rapport_", r, ".html"))
}
résultera en 4 rapports personnalisés : rapport_11.html, rapport_94.html,…
Exercice 8. rapports paramétrés
Inclusions
En tout point du qmd :
{{< include entete.qmd >}}
ou dans le YAML pour ajouter de simples en-tête et pieds de page :
---
format:
html:
include-before-body: en_tete.html
include-after-body: pied.html
---
Cache
Pour les calculs longs et rarement variables on peut gagner du temps avec cache: true
(au niveau document ou chunk).
```{r}
#| label: long-traitement
#| cache: true
#| cache-extra : !expr file.mtime("donnees/departements.gpkg")
region <- read_sf("donnees/departements.gpkg") |>
st_union()
```
Ne sera exécuté qu’une fois sauf si le code du chunk change ou si la date du fichier change ou si on passe à cache: false
, ou via :
quarto render mon_document.qmd --cache-refresh
cache
peut être défini au niveau projet, document ou chunk.
Crosstalk
// TODO
Dashboards
// TODO
Marque de l’État
Typographie Marianne
Pour textes et graphiques (Service d’information du gouvernement, 2020)
Installer {ragg}, {systemfonts} et {textshaping}
Dans l’en-tête yaml du document Quarto :
--- mainfont: Marianne knitr: opts_chunk: dev: "ragg_png" ---
Permet d’avoir la police Marianne pour le texte et de la prendre en compte dans les graphiques ggplot.
Autre option (à mettre dans un chunk de configuration en début de document) : knitr::opts_chunk$set(dev = "ragg_png")
Couleurs
Modification du thème ou des CSS
// TODO
Références
Notes de bas de page
page d’aide sur les notes de bas de page.↩︎