2 Introduction à flextable
2.1 Reporting tabulaire avec flextable
Son but est de simplifier la création et la personnalisation de tableaux en offrant une interface souple et conviviale au sein de l’environnement R. Le package propose de nombreuses fonctionnalités pour préparer la structure des tableaux, formater le contenu et l’apparence.
Code
library(flextable)
<- summarizor(cars) %>%
ft as_flextable(sep_w = 0) %>%
color(
i = ~ stat == "range",
color = "pink"
%>%
) bold(j = 1) %>%
italic(j = 2, italic = TRUE)
ft
Statistic | ||
---|---|---|
speed | Mean (SD) | 15.4 (5.3) |
Median (IQR) | 15.0 (7.0) | |
Range | 4.0 - 25.0 | |
dist | Mean (SD) | 43.0 (25.8) |
Median (IQR) | 36.0 (30.0) | |
Range | 2.0 - 120.0 |
2.1.1 Fonctions principales
Deux fonctions principales sont fournies afin de créer des tableaux :
flextable()
permet de créer facilement un tableau de reporting à partir d’un data.frame.
Code
head(airquality) %>%
flextable() %>%
autofit()
Ozone | Solar.R | Wind | Temp | Month | Day |
---|---|---|---|---|---|
41 | 190 | 7.4 | 67 | 5 | 1 |
36 | 118 | 8.0 | 72 | 5 | 2 |
12 | 149 | 12.6 | 74 | 5 | 3 |
18 | 313 | 11.5 | 62 | 5 | 4 |
14.3 | 56 | 5 | 5 | ||
28 | 14.9 | 66 | 5 | 6 |
- La fonction
as_flextable()
est founie pour transformer des objets R en tableaux ‘flextable’ sans avoir à préparer le data.frame original.
Code
<- with(palmerpenguins::penguins, table(species, island)) %>%
ft as_flextable()
ft
species | island | ||||
---|---|---|---|---|---|
Biscoe | Dream | Torgersen | Total | ||
Adelie | Count | 44 (12.8%) | 56 (16.3%) | 52 (15.1%) | 152 (44.2%) |
Mar. pct (1) | 26.2% ; 28.9% | 45.2% ; 36.8% | 100.0% ; 34.2% | ||
Chinstrap | Count | 0 (0.0%) | 68 (19.8%) | 0 (0.0%) | 68 (19.8%) |
Mar. pct | 0.0% ; 0.0% | 54.8% ; 100.0% | 0.0% ; 0.0% | ||
Gentoo | Count | 124 (36.0%) | 0 (0.0%) | 0 (0.0%) | 124 (36.0%) |
Mar. pct | 73.8% ; 100.0% | 0.0% ; 0.0% | 0.0% ; 0.0% | ||
Total | Count | 168 (48.8%) | 124 (36.0%) | 52 (15.1%) | 344 (100.0%) |
(1) Columns and rows percentages |
Une fois que l’on a un objet flextable, il est possible d’utiliser l’ensemble des fonctions disponibles pour ajouter ou supprimer des lignes et des colonnes, pour colorer ou mettre en gras le contenu des cellules, pour fusionner des cellules, etc.
Code
<- add_header_lines(ft, "Size measurements for adult foraging penguins near Palmer Station, Antarctica") %>%
ft italic(part = "header", i = 1) %>%
color(color = "#0099FC", part = "footer")
ft
Size measurements for adult foraging penguins near Palmer Station, Antarctica | |||||
---|---|---|---|---|---|
species | island | ||||
Biscoe | Dream | Torgersen | Total | ||
Adelie | Count | 44 (12.8%) | 56 (16.3%) | 52 (15.1%) | 152 (44.2%) |
Mar. pct (1) | 26.2% ; 28.9% | 45.2% ; 36.8% | 100.0% ; 34.2% | ||
Chinstrap | Count | 0 (0.0%) | 68 (19.8%) | 0 (0.0%) | 68 (19.8%) |
Mar. pct | 0.0% ; 0.0% | 54.8% ; 100.0% | 0.0% ; 0.0% | ||
Gentoo | Count | 124 (36.0%) | 0 (0.0%) | 0 (0.0%) | 124 (36.0%) |
Mar. pct | 73.8% ; 100.0% | 0.0% ; 0.0% | 0.0% ; 0.0% | ||
Total | Count | 168 (48.8%) | 124 (36.0%) | 52 (15.1%) | 344 (100.0%) |
(1) Columns and rows percentages |
2.1.2 Sorties supportées
- HTML
- Microsoft Word and RTF
- Microsoft PowerPoint
- ‘grid graphics’
- Excel (https://github.com/pteridin/flexlsx)
Vous pouvez rapidement sauvegarder le résultat :
- dans un document Microsoft Word avec
save_as_docx()
, - dans une présentation Microsoft PowerPoint avec
save_as_pptx()
, - dans un PNG avec
save_as_image()
avec un support complet des polices.
Code
save_as_docx(ft, path = "assets/files/ft.docx")
save_as_pptx(ft, path = "assets/files/ft.pptx")
save_as_image(ft, path = "assets/files/ft.png")
Vous pouvez utiliser également le R Markdown et Quarto, les tableaux seront automatiquement générés à l’impression.
En mode interactif, il est aussi possible d’appeler la fonction print()
avec l’argument preview="docx"
ou preview="pdf"
. Le tableau sera alors intégré à un document et ce dernier sera ouvert par le programme associé au format automatiquement.
Code
print(ft, preview = "docx")
2.1.3 Réaliser des tableaux homogènes
Lors de la création d’un tableau, des valeurs par défaut sont utilisées comme la famille de police, la taille de la police, le remplissage, l’alignement du texte… Ces propriétés sont utilisées lors de la création du tableau mobile et par les fonctions thème.
Il est recommandé de ne les spécifier qu’une seule fois dans la session R afin d’obtenir des tableaux cohérents mais aussi afin d’éviter d’avoir à appeler de nombreuses fois les mêmes fonctions.
Elles peuvent être lues avec la fonction get_flextable_defaults()
et , plus important, peuvent être mises à jour avec la fonction set_flextable_defaults()
.
Code
set_flextable_defaults(
font.color = "#0099FC",
border.color = "red",
theme_fun = "theme_box"
)
<- data.frame(
dat wool = c("A", "B"),
L = c(44.56, 28.22),
M = c(24, 28.77),
H = c(24.56, 18.78)
)flextable(dat)
wool | L | M | H |
---|---|---|---|
A | 44.56 | 24.00 | 24.56 |
B | 28.22 | 28.77 | 18.78 |
Les valeurs définies précédemment sont un peu criardes, nous allons utiliser des valeurs plus raisonnables. Ce paramétrage n’est à faire qu’une seule fois dans votre session R.
Code
set_flextable_defaults(
font.size = 12, font.family = "Open Sans",
font.color = "#333333",
table.layout = "fixed",
border.color = "gray",
theme_fun = theme_booktabs,
padding.top = 3, padding.bottom = 3,
padding.left = 4, padding.right = 4
)
Code
flextable(dat)
wool | L | M | H |
---|---|---|---|
A | 44.56 | 24.00 | 24.56 |
B | 28.22 | 28.77 | 18.78 |
2.2 La largeur des colonnes
Par défaut, la largeur des colonnes d’un flextable est fixe, ce qui signifie que par défaut elles ont une largeur constante indépendamment du contenu. Dans de nombreuses situations, il sera préférable d’ajuster la largeur des colonnes en fonction du contenu réel. C’est là que la fonction autofit()
entre en jeu.
La fonction autofit()
permet de régler automatiquement la largeur des colonnes en fonction du contenu présent dans chaque colonne. En utilisant cette fonction, les colonnes du flextable s’ajusteront pour s’adapter au contenu le plus large de chaque colonne. Cela garantit que le tableau final est esthétiquement agréable et que toutes les données sont affichées correctement, sans troncature.
Code
flextable(dat) %>% autofit()
wool | L | M | H |
---|---|---|---|
A | 44.56 | 24.00 | 24.56 |
B | 28.22 | 28.77 | 18.78 |
Il est aussi possible de définir un ajustement automatique géré par le moteur de document utilisé! C’est à dire qu’on laisse la responsabilité à Word, au navigateur Web ou au lecteur PDF de définir librement et au mieux la taille des colonnes pour optimiser l’affichage du tableau dans le document. Pour utliser cette option, il faut alors définir une propriété du tableau nommée layout='autofit'
qui sera définie avec la fonction set_table_properties()
:
Code
flextable(dat) %>% set_table_properties(layout = "autofit")
wool | L | M | H |
---|---|---|---|
A | 44.56 | 24.00 | 24.56 |
B | 28.22 | 28.77 | 18.78 |
Par défaut, ce layout est défini à fixed
, dans ce cas seulement, la fonction autofit()
aura un effet. Dans le cas du layout défini à autofit
, les tailles de colonnes ne seront pas inscrites dans la sortie (attention, la sortie PPTX ne supporte pas le layout ‘autofit’ mais seulement ‘fixed’).
Par la suite, on utilisera le plus souvent autofit()
.
2.3 Formater le contenu
Le contenu peut être composé comme le résultat d’une concaténation de plusieurs morceaux, les morceaux pouvant même être des images ou des graphiques mais en général plutôt des textes.
Par défaut, le contenu affiché de chaque cellule sera le résultat d’une simple mise en forme, la fonction format()
est appelée pour ce simple affichage. L’objectif est de fournir à peu près le même affichage que dans votre console R.
2.3.1 Les fonctions colformat
Toutefois, il est fréquent d’avoir besoin d’un affichage spécifique.
A moins de créer des contenus composites, les fonctions colformat_*()
suffiront. S’il s’agit d’une colonne de chaînes de caractères, elle restera telle quelle, s’il s’agit de nombres, elle sera transformée en une chaîne de caractères avec un nombre de décimales, s’il s’agit d’une date, elle sera transformée en une chaîne de caractères représentant une date, et ainsi de suite. Vous pouvez contrôler ces options avec les fonctions colformat_double()
, colformat_int()
, colformat_char()
, colformat_date()
, etc.
Les paramètres principaux de ces fonctions peuvent être définis avec set_flextable_defaults()
, c’est même encouragé afin de réduire le code et d’homogénéiser les sorties :
Code
set_flextable_defaults(decimal.mark = ",", digits = 3, big.mark = " ")
On vient de préciser que par défaut le séparateur des décimales est “,” et que le nombre de chiffres après la virgule doit être de 3.
Code
flextable(head(ggplot2::diamonds)) %>%
colformat_double() %>%
colformat_int(j = "price", suffix = "$") %>%
autofit()
carat | cut | color | clarity | depth | table | price | x | y | z |
---|---|---|---|---|---|---|---|---|---|
0,230 | Ideal | E | SI2 | 61,500 | 55,000 | 326$ | 3,950 | 3,980 | 2,430 |
0,210 | Premium | E | SI1 | 59,800 | 61,000 | 326$ | 3,890 | 3,840 | 2,310 |
0,230 | Good | E | VS1 | 56,900 | 65,000 | 327$ | 4,050 | 4,070 | 2,310 |
0,290 | Premium | I | VS2 | 62,400 | 58,000 | 334$ | 4,200 | 4,230 | 2,630 |
0,310 | Good | J | SI2 | 63,300 | 58,000 | 335$ | 4,340 | 4,350 | 2,750 |
0,240 | Very Good | J | VVS2 | 62,800 | 57,000 | 336$ | 3,940 | 3,960 | 2,480 |
Il est bien sûr toujours possible de préciser une autre valeur :
Code
flextable(head(cars)) %>%
colformat_double(digits = 0) %>%
autofit()
speed | dist |
---|---|
4 | 2 |
4 | 10 |
7 | 4 |
7 | 22 |
8 | 16 |
9 | 10 |
2.3.1.1 Les paramètres de colformat
Comme vous l’avez peut-être remarqué dans l’exemple d’avant, on peut utiliser la notion de préfixe. D’autres paramètres sont disponibles :
prefix
etsuffix
permettent de préciser un préfixe et ou un suffixe à utiliser.na_str
permet de préciser quelle valeur afficher à la place des valeurs manquantes.
Pour les chiffres, en général, on peut préciser :
big.mark
, le séparateur des milliersdecimal.mark
, le séparateur décimaldigits
, le nombre de chiffres après la virgule.
Code
<- flextable(head(airquality))
ft <- colformat_int(
ft x = ft,
na_str = "N/A"
)autofit(ft)
Ozone | Solar.R | Wind | Temp | Month | Day |
---|---|---|---|---|---|
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
N/A | N/A | 14,3 | 56 | 5 | 5 |
28 | N/A | 14,9 | 66 | 5 | 6 |
Il n’est jamais nécessaire de changer ses données en chaînes de caractères pré-formattées, il est vivement recommandé d’utiliser plutôt ces paramètres. Ainsi, vous gardez la possibilité de faire du formattage conditionnel sur les valeurs numériques.
2.3.2 Les tabulations et les retours chariot
Lorsque vous travaillez avec flextable, si une chaîne de caractères contient \n
elle sera traitée comme un retour à la ligne (et non comme un nouveau paragraphe !). Si une chaîne de caractères contient \t
, elle sera traitée comme une tabulation.
Code
data.frame(
`co\nco` = paste0(c("\t", "\t\t", "\t\t\t"), 1:3),
check.names = FALSE
%>% flextable() )
co |
---|
1 |
2 |
3 |
Nous ne recommandons pas de modifier vos données pour qu’elles contiennent \n
ou \t
. Nous recommandons plutôt d’utiliser mk_par()
, prepend_chunks()
ou append_chunks()
.
Code
<- dplyr::select(formatters::ex_adsl, AGE, SEX, COUNTRY, ARM)
adsl
<- summarizor(adsl, by = "ARM") %>%
ft as_flextable(
sep_w = 0, separate_with = "variable",
spread_first_col = TRUE
%>%
) align(i = ~ !is.na(variable), align = "left")
ft
A: Drug X | B: Placebo | C: Combination | |
---|---|---|---|
AGE | |||
Mean (SD) | 33,769 (6,553) | 35,433 (7,895) | 35,432 (7,722) |
Median (IQR) | 33,000 (11,000) | 35,000 (10,000) | 35,000 (10,000) |
Range | 21,000 - 50,000 | 21,000 - 62,000 | 20,000 - 69,000 |
SEX | |||
F | 79 (59,0%) | 77 (57,5%) | 66 (50,0%) |
M | 51 (38,1%) | 55 (41,0%) | 60 (45,5%) |
U | 3 (2,2%) | 2 (1,5%) | 4 (3,0%) |
UNDIFFERENTIATED | 1 (0,7%) | 0 (0,0%) | 2 (1,5%) |
COUNTRY | |||
CHN | 74 (55,2%) | 81 (60,4%) | 64 (48,5%) |
USA | 10 (7,5%) | 13 (9,7%) | 17 (12,9%) |
BRA | 13 (9,7%) | 7 (5,2%) | 10 (7,6%) |
PAK | 12 (9,0%) | 9 (6,7%) | 10 (7,6%) |
NGA | 8 (6,0%) | 7 (5,2%) | 11 (8,3%) |
RUS | 5 (3,7%) | 8 (6,0%) | 6 (4,5%) |
JPN | 5 (3,7%) | 4 (3,0%) | 9 (6,8%) |
GBR | 4 (3,0%) | 3 (2,2%) | 2 (1,5%) |
CAN | 3 (2,2%) | 2 (1,5%) | 3 (2,3%) |
CHE | 0 (0,0%) | 0 (0,0%) | 0 (0,0%) |
Par exemple, voici comment utiliser prepend_chunks()
pour ajouter une tabulation devant les valeurs où variable
est manquante et donc qui représente une sous-catégorie.
Code
prepend_chunks(ft, i = ~ is.na(variable), j = "stat", as_chunk("\t"))
A: Drug X | B: Placebo | C: Combination | |
---|---|---|---|
AGE | |||
Mean (SD) | 33,769 (6,553) | 35,433 (7,895) | 35,432 (7,722) |
Median (IQR) | 33,000 (11,000) | 35,000 (10,000) | 35,000 (10,000) |
Range | 21,000 - 50,000 | 21,000 - 62,000 | 20,000 - 69,000 |
SEX | |||
F | 79 (59,0%) | 77 (57,5%) | 66 (50,0%) |
M | 51 (38,1%) | 55 (41,0%) | 60 (45,5%) |
U | 3 (2,2%) | 2 (1,5%) | 4 (3,0%) |
UNDIFFERENTIATED | 1 (0,7%) | 0 (0,0%) | 2 (1,5%) |
COUNTRY | |||
CHN | 74 (55,2%) | 81 (60,4%) | 64 (48,5%) |
USA | 10 (7,5%) | 13 (9,7%) | 17 (12,9%) |
BRA | 13 (9,7%) | 7 (5,2%) | 10 (7,6%) |
PAK | 12 (9,0%) | 9 (6,7%) | 10 (7,6%) |
NGA | 8 (6,0%) | 7 (5,2%) | 11 (8,3%) |
RUS | 5 (3,7%) | 8 (6,0%) | 6 (4,5%) |
JPN | 5 (3,7%) | 4 (3,0%) | 9 (6,8%) |
GBR | 4 (3,0%) | 3 (2,2%) | 2 (1,5%) |
CAN | 3 (2,2%) | 2 (1,5%) | 3 (2,3%) |
CHE | 0 (0,0%) | 0 (0,0%) | 0 (0,0%) |
2.3.3 Remplacement des textes affichés
La fonction labelizor()
vont vous permettre de remplacer les valeurs affichées d’un tableau mobile par d’autres textes. Vous pouvez soit utiliser des textes associés au nom qui correspond aux occurences à remplacer, soit utiliser une fonction.
Illustrons ces deux options avec un tableau représentant une agrégation. Partons d’un tableau d’agrégation simple :
Code
library(palmerpenguins)
<- penguins %>%
dat select(species, island, ends_with("mm")) %>%
group_by(species, island) %>%
summarise(
across(
where(is.numeric),
.fns = list(
avg = ~ mean(.x, na.rm = TRUE),
sd = ~ sd(.x, na.rm = TRUE)
)
),.groups = "drop"
%>%
) rename_with(~ tolower(gsub("_mm_", "_", .x, fixed = TRUE)))
<- flextable(dat) %>%
ft_pen colformat_double() %>%
separate_header() %>%
theme_vanilla() %>%
align(align = "center", part = "all") %>%
valign(valign = "center", part = "header") %>%
autofit()
ft_pen
species | island | bill | flipper | ||||
---|---|---|---|---|---|---|---|
length | depth | length | |||||
avg | sd | avg | sd | avg | sd | ||
Adelie | Biscoe | 38,975 | 2,481 | 18,370 | 1,189 | 188,795 | 6,729 |
Adelie | Dream | 38,502 | 2,465 | 18,252 | 1,134 | 189,732 | 6,585 |
Adelie | Torgersen | 38,951 | 3,025 | 18,429 | 1,339 | 191,196 | 6,232 |
Chinstrap | Dream | 48,834 | 3,339 | 18,421 | 1,135 | 195,824 | 7,132 |
Gentoo | Biscoe | 47,505 | 3,082 | 14,982 | 0,981 | 217,187 | 6,485 |
Remplaçons d’abord les noms des colonnes “avg” et “sd” par les mots “Mean” et “Standard Deviation”.
Code
<- labelizor(
ft_pen x = ft_pen,
part = "header",
labels = c("avg" = "Mean", "sd" = "Standard Deviation")
) ft_pen
species | island | bill | flipper | ||||
---|---|---|---|---|---|---|---|
length | depth | length | |||||
Mean | Standard Deviation | Mean | Standard Deviation | Mean | Standard Deviation | ||
Adelie | Biscoe | 38,975 | 2,481 | 18,370 | 1,189 | 188,795 | 6,729 |
Adelie | Dream | 38,502 | 2,465 | 18,252 | 1,134 | 189,732 | 6,585 |
Adelie | Torgersen | 38,951 | 3,025 | 18,429 | 1,339 | 191,196 | 6,232 |
Chinstrap | Dream | 48,834 | 3,339 | 18,421 | 1,135 | 195,824 | 7,132 |
Gentoo | Biscoe | 47,505 | 3,082 | 14,982 | 0,981 | 217,187 | 6,485 |
Et maintenant, formatons les en-têtes avec une lettre en majuscule pour la première lettre et les autres lettres en minuscule :
Code
<- labelizor(
ft_pen x = ft_pen,
part = "header",
labels = stringr::str_to_title
) ft_pen
Species | Island | Bill | Flipper | ||||
---|---|---|---|---|---|---|---|
Length | Depth | Length | |||||
Mean | Standard Deviation | Mean | Standard Deviation | Mean | Standard Deviation | ||
Adelie | Biscoe | 38,975 | 2,481 | 18,370 | 1,189 | 188,795 | 6,729 |
Adelie | Dream | 38,502 | 2,465 | 18,252 | 1,134 | 189,732 | 6,585 |
Adelie | Torgersen | 38,951 | 3,025 | 18,429 | 1,339 | 191,196 | 6,232 |
Chinstrap | Dream | 48,834 | 3,339 | 18,421 | 1,135 | 195,824 | 7,132 |
Gentoo | Biscoe | 47,505 | 3,082 | 14,982 | 0,981 | 217,187 | 6,485 |
2.4 Les caractéristiques visuelles
Code
<- data.frame(
dat wool = c("A", "B"),
L = c(44.56, 28.22),
M = c(24, 28.77),
H = c(24.56, 18.78)
)
2.4.1 Les fonctions de formattage visuel
Il existe des fonctions simples pour modifier une propriété de formatage :
- Le texte peut être formaté avec les fonctions
bold()
,italic()
,color()
,fontsize()
,font()
,highlight()
Code
flextable(dat) %>%
fontsize(i = ~ wool %in% "A", size = 10) %>%
font(part = "all", fontname = "Inconsolata") %>%
color(part = "header", color = "#e22323", j = c("L", "M", "H")) %>%
bold(part = "header", j = c("L", "M")) %>%
italic(part = "all", j = "wool") %>%
highlight(i = ~ L < 30, color = "wheat", j = c("M", "H"))
wool | L | M | H |
---|---|---|---|
A | 44,56 | 24,00 | 24,56 |
B | 28,22 | 28,77 | 18,78 |
- Les paragraphes avec les fonctions
line_spacing()
,padding()
etalign()
,
Code
<- flextable(dat) %>%
ft align(align = "center", part = "all") %>%
line_spacing(space = 2, part = "all") %>%
padding(padding = 6, part = "header")
ft
wool | L | M | H |
---|---|---|---|
A | 44,56 | 24,00 | 24,56 |
B | 28,22 | 28,77 | 18,78 |
- Les cellules avec les fonctions
bg()
,valign()
ethrule()
.
Code
%>%
ft bg(bg = "black", part = "all") %>%
color(color = "white", part = "all") %>%
merge_at(i = 1:2, j = 1) %>%
valign(i = 1, valign = "bottom")
wool | L | M | H |
---|---|---|---|
A | 44,56 | 24,00 | 24,56 |
28,22 | 28,77 | 18,78 |
Les couleurs d’arrière-plan, les couleurs de police et les couleurs de surbrillance peuvent être modifiées avec un vecteur ou avec une fonction qui renvoie un vecteur de caractères de couleurs (comme avec ‘ggplot2’ - voir scales::col_numeric
).
Code
<- as.data.frame(matrix(runif(5 * 5), ncol = 5)) %>%
myft flextable() %>%
colformat_double() %>%
autofit() %>%
align(align = "center", part = "all") %>%
bg(bg = "black", part = "header") %>%
color(color = "white", part = "all") %>%
bg(bg = scales::col_numeric(palette = "viridis", domain = c(0, 1)))
myft
V1 | V2 | V3 | V4 | V5 |
---|---|---|---|---|
0,623 | 0,402 | 0,043 | 0,740 | 0,603 |
0,765 | 0,891 | 0,946 | 0,536 | 0,243 |
0,986 | 0,435 | 0,770 | 0,904 | 0,829 |
0,211 | 0,531 | 0,053 | 0,261 | 0,446 |
0,717 | 0,499 | 0,879 | 0,502 | 0,729 |
La rotation du texte des cellules est une autre option qui peut être utilisée - il est recommandé de l’utiliser avec hrule(rule = "exact")
lorsque la sortie est Word ou PowerPoint.
Code
<- myft %>%
myft rotate(rotation = "tbrl", part = "header", align = "center") %>%
height(height = 1, unit = "cm", part = "header") %>%
hrule(rule = "exact", part = "header") %>%
align(align = "right", part = "header")
myft
V1 | V2 | V3 | V4 | V5 |
---|---|---|---|---|
0,623 | 0,402 | 0,043 | 0,740 | 0,603 |
0,765 | 0,891 | 0,946 | 0,536 | 0,243 |
0,986 | 0,435 | 0,770 | 0,904 | 0,829 |
0,211 | 0,531 | 0,053 | 0,261 | 0,446 |
0,717 | 0,499 | 0,879 | 0,502 | 0,729 |
2.4.2 Bordures
2.4.2.1 Bordures intérieures et extérieures
Si aucune mise en forme conditionnelle n’est nécessaire, utilisez border_outer()
, border_inner_h()
et border_inner_v()
. Ce sont les fonctions les plus simples et elles satisfont la plupart des cas d’utilisation.
Code
library(officer)
<- fp_border(color = "red", width = 2)
big_border <- fp_border(color = "gray", width = 1)
small_border
<- flextable(head(airquality))
myft <- border_remove(x = myft)
myft <- border_outer(myft, part = "all", border = big_border)
myft <- border_inner_h(myft, part = "all", border = small_border)
myft <- border_inner_v(myft, part = "all", border = small_border)
myft myft
Ozone | Solar.R | Wind | Temp | Month | Day |
---|---|---|---|---|---|
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |
2.4.2.2 Ajouter des lignes
Lorsqu’une plus grande maîtrise de la mise en forme des bordures est nécessaire, les fonctions suivantes peuvent être utilisées pour ajouter des lignes verticales ou horizontales comme bordures :
hline()
: définir les bordures inférieures (horizontales intérieures)vline()
: définir les bordures droites (verticales intérieures)hline_top()
: définir la bordure supérieure (horizontale extérieure)hline_bottom()
: définir la bordure inférieure (horizontale extérieure)vline_left()
: définir la bordure gauche (verticale extérieure)vline_right()
: définir la bordure droite (verticale extérieure)
Code
<- border_remove(myft)
myft2
<- vline(myft2, border = small_border, part = "all")
myft2 <- vline_left(myft2, border = big_border, part = "all")
myft2 <- vline_right(myft2, border = big_border, part = "all")
myft2 <- hline(myft2, border = small_border)
myft2 <- hline_bottom(myft2, border = big_border)
myft2 <- hline_top(myft2, border = big_border, part = "all")
myft2 myft2
Ozone | Solar.R | Wind | Temp | Month | Day |
---|---|---|---|---|---|
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |
Ces fonctions prennent également en charge les sélecteurs de lignes i
et de colonnes j
.
2.4.3 Fonctions de thème
Les fonctions de thème ne sont pas comme les thèmes ‘ggplot2’. Elles sont appliquées à la table existante immédiatement. Les fonctions de thème doivent être appliquées après l’ajout de tous les éléments de la table.
Si vous souhaitez appliquer automatiquement une fonction de thème à chaque flextable, vous pouvez utiliser l’argument theme_fun
de set_flextable_defaults()
; soyez conscient que cette fonction de thème est appliquée en tant que dernière instruction lors de l’appel de flextable()
- donc si vous ajoutez des en-têtes ou des pieds de page au tableau, ils ne seront pas formatés avec le thème.
Vous pouvez également utiliser l’argument post_process_html
de set_flextable_defaults()
(ou post_process_pdf
, post_process_docx
, post_process_pptx
) pour spécifier un thème à appliquer systématiquement avant l’impression de flextable()
. Assurer vous bien que votre thème ne remplace pas la mise en forme effectuée avant l’instruction d’impression.
2.4.3.1 Thèmes disponibles
Code
<- flextable(head(airquality))
ft <- add_header_row(ft,
ft top = TRUE,
values = c("mesures", "temps"),
colwidths = c(4, 2)
)<- align(ft, i = 1, align = "center", part = "header")
ft <- width(ft, width = .75) ft
theme_booktabs()
est le thème par défaut. Il ajoute des bordures, aligne le texte à gauche dans les colonnes de texte et aligne à droite dans les colonnes non textuelles.
Code
theme_booktabs(ft)
mesures | temps | ||||
---|---|---|---|---|---|
Ozone | Solar.R | Wind | Temp | Month | Day |
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |
theme_alafoli()
offre un aspect gris clair :
Code
theme_alafoli(ft)
mesures | temps | ||||
---|---|---|---|---|---|
Ozone | Solar.R | Wind | Temp | Month | Day |
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |
theme_vader()
offre un aspect sombre :
Code
theme_vader(ft)
mesures | temps | ||||
---|---|---|---|---|---|
Ozone | Solar.R | Wind | Temp | Month | Day |
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |
theme_box()
n’est pas joli mais utile lors de la création d’un tableau si vous voulez vous assurer que la mise en page que vous définissez est exactement comme prévu :
Code
theme_box(ft)
mesures | temps | ||||
---|---|---|---|---|---|
Ozone | Solar.R | Wind | Temp | Month | Day |
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |
theme_vanilla()
ressemble àtheme_booktabs()
mais comporte des lignes horizontales fines séparant les lignes :
Code
theme_vanilla(ft)
mesures | temps | ||||
---|---|---|---|---|---|
Ozone | Solar.R | Wind | Temp | Month | Day |
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |
theme_zebra()
vous permet de créer des tableaux zébréstheme_tron_legacy()
ettheme_tron()
sont des thèmes sombres.
2.4.3.2 Définir votre propre thème
Vous pouvez facilement définir votre propre thème en créant une fonction.
Code
<- function(x, ...) {
mon_theme <- colformat_double(x, big.mark = "'", decimal.mark = ",", digits = 1)
x <- set_table_properties(x, layout = "fixed")
x <- border_remove(x)
x <- fp_border(width = 1, color = "orange")
std_border <- border_outer(x, part = "all", border = std_border)
x <- border_inner_h(x, border = std_border, part = "all")
x <- border_inner_v(x, border = std_border, part = "all")
x autofit(x)
}mon_theme(ft)
mesures | temps | ||||
---|---|---|---|---|---|
Ozone | Solar.R | Wind | Temp | Month | Day |
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |
2.5 Les en-têtes et pieds de tableau
Les en-têtes, les pieds (et le corps) du tableau peuvent être complétés par des lignes et les valeurs affichées peuvent être modifiées.
2.5.1 Séparer les noms de colonnes en plusieurs lignes
Quand les noms des colonnes contiennent plusieurs labels (résultant d’une concaténation par exemple), il est possible de les répartir et organiser sur plusieurs lignes très simplement en utilisant la fonction separate_header()
.
Code
<- flextable(head(iris))
ft separate_header(ft)
Sepal | Petal | Species | ||
---|---|---|---|---|
Length | Width | Length | Width | |
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 |
C’est particulièrement utile pour présenter des agrégations réalisées avec la fonction dplyr::summarise()
.
Code
library(palmerpenguins)
<- penguins %>%
dat select(species, island, ends_with("mm")) %>%
group_by(species, island) %>%
summarise(
across(
where(is.numeric),
.fns = list(
avg = ~ mean(.x, na.rm = TRUE),
sd = ~ sd(.x, na.rm = TRUE)
)
),.groups = "drop"
) dat
species | island | bill_length_mm_avg | bill_length_mm_sd | bill_depth_mm_avg | bill_depth_mm_sd | flipper_length_mm_avg | flipper_length_mm_sd |
---|---|---|---|---|---|---|---|
factor | factor | numeric | numeric | numeric | numeric | numeric | numeric |
Adelie | Biscoe | 38,975 | 2,481 | 18,370 | 1,189 | 188,795 | 6,729 |
Adelie | Dream | 38,502 | 2,465 | 18,252 | 1,134 | 189,732 | 6,585 |
Adelie | Torgersen | 38,951 | 3,025 | 18,429 | 1,339 | 191,196 | 6,232 |
Chinstrap | Dream | 48,834 | 3,339 | 18,421 | 1,135 | 195,824 | 7,132 |
Gentoo | Biscoe | 47,505 | 3,082 | 14,982 | 0,981 | 217,187 | 6,485 |
n: 5 |
Code
<- flextable(dat) %>%
ft_pen separate_header() %>%
align(align = "center", part = "all") %>%
theme_box() %>%
colformat_double(digits = 2) %>%
autofit()
ft_pen
species | island | bill | flipper | ||||
---|---|---|---|---|---|---|---|
length | depth | length | |||||
mm | |||||||
avg | sd | avg | sd | avg | sd | ||
Adelie | Biscoe | 38,98 | 2,48 | 18,37 | 1,19 | 188,80 | 6,73 |
Adelie | Dream | 38,50 | 2,47 | 18,25 | 1,13 | 189,73 | 6,59 |
Adelie | Torgersen | 38,95 | 3,03 | 18,43 | 1,34 | 191,20 | 6,23 |
Chinstrap | Dream | 48,83 | 3,34 | 18,42 | 1,14 | 195,82 | 7,13 |
Gentoo | Biscoe | 47,50 | 3,08 | 14,98 | 0,98 | 217,19 | 6,48 |
2.5.2 Modifier les libellés d’en-tête
Utilisez set_header_labels()
pour remplacer les étiquettes de la ligne inférieure de l’en-tête. Lorsque le tableau est créé, leurs valeurs sont les noms des colonnes du data.frame.
Code
<- flextable(head(airquality))
ft <- set_header_labels(ft,
ft Solar.R = "Solar R (lang)",
Temp = "Temperature (degrees F)", Wind = "Wind (mph)",
Ozone = "Ozone (ppb)"
)<- set_table_properties(ft, layout = "autofit", width = .8)
ft ft
Ozone (ppb) | Solar R (lang) | Wind (mph) | Temperature (degrees F) | Month | Day |
---|---|---|---|---|---|
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |
2.5.3 Ajouter des lignes dans l’en-tête ou le pied du tableau
De nouvelles lignes d’en-tête peuvent être ajoutées en haut ou en bas de l’en-tête.
Les fonctions nommées ci-dessous doivent être utilisées pour ajouter une ligne d’en-tête (ou de pied de page) :
- La plupart des besoins seront satisfaits par les fonctions
add_header_row()
etadd_footer_row()
. Il s’agit de fonctions qui vous permettent d’ajouter une seule ligne d’étiquettes (qui peuvent être affichées le long d’une ou de plusieurs colonnes dans la nouvelle ligne). - Les fonctions
add_header()
etadd_footer()
sont des fonctions qui vous permettent d’ajouter plusieurs valeurs (une pour chaque nouvelle ligne) pour une colonne donnée. - Les fonctions
add_footer_lines()
etadd_header_lines()
sont des fonctions qui ajoutent des étiquettes sur une ligne où toutes les colonnes sont fusionnées.
Nous allons principalement démontrer les en-têtes mais la même chose peut être appliquée aux pieds de page.
2.5.3.1 Ajouter une ligne d’en-tête
Utilisez la fonction add_header_row()
: ajoutez une ligne d’en-tête où des libellés sont associés à un nombre de colonnes à fusionner.
Code
<- add_header_row(
ft x = ft, values = c("mesures de la qualité de l'air", "temps"),
colwidths = c(4, 2)
)<- theme_box(ft)
ft ft
mesures de la qualité de l'air | temps | ||||
---|---|---|---|---|---|
Ozone (ppb) | Solar R (lang) | Wind (mph) | Temperature (degrees F) | Month | Day |
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |
2.5.3.2 Ajouter des lignes de texte
Utilisez la fonction add_header_lines()
: ajoutez des libellés dans de nouvelles lignes d’en-tête (toutes les colonnes sont fusionnées).
Code
<- add_header_lines(ft,
ft values = c(
"c'est une première ligne",
"c'est une deuxième ligne"
)
)theme_box(ft)
c'est une première ligne | |||||
---|---|---|---|---|---|
c'est une deuxième ligne | |||||
mesures de la qualité de l'air | temps | ||||
Ozone (ppb) | Solar R (lang) | Wind (mph) | Temperature (degrees F) | Month | Day |
41 | 190 | 7,4 | 67 | 5 | 1 |
36 | 118 | 8,0 | 72 | 5 | 2 |
12 | 149 | 12,6 | 74 | 5 | 3 |
18 | 313 | 11,5 | 62 | 5 | 4 |
14,3 | 56 | 5 | 5 | ||
28 | 14,9 | 66 | 5 | 6 |