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)
ft <- summarizor(cars) %>%
  as_flextable(sep_w = 0) %>%
  color(
    i = ~ stat == "range",
    color = "pink"
  ) %>%
  bold(j = 1) %>%
  italic(j = 2, italic = TRUE)
ft

Statistic
(N=50)

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
ft <- with(palmerpenguins::penguins, table(species, island)) %>%
  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
ft <- add_header_lines(ft, "Size measurements for adult foraging penguins near Palmer Station, Antarctica") %>%
  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

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"
)

dat <- data.frame(
  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 et suffix 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 milliers
  • decimal.mark, le séparateur décimal
  • digits, le nombre de chiffres après la virgule.
Code
ft <- flextable(head(airquality))
ft <- colformat_int(
  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
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
adsl <- dplyr::select(formatters::ex_adsl, AGE, SEX, COUNTRY, ARM)

ft <- summarizor(adsl, by = "ARM") %>%
  as_flextable(
    sep_w = 0, separate_with = "variable",
    spread_first_col = TRUE
  ) %>%
  align(i = ~ !is.na(variable), align = "left")
ft

A: Drug X
(N=134)

B: Placebo
(N=134)

C: Combination
(N=132)

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
(N=134)

B: Placebo
(N=134)

C: Combination
(N=132)

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)

dat <- penguins %>%
  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)))

ft_pen <- flextable(dat) %>%
  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
ft_pen <- labelizor(
  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
ft_pen <- labelizor(
  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
dat <- data.frame(
  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() et align(),
Code
ft <- flextable(dat) %>%
  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() et hrule().
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
myft <- as.data.frame(matrix(runif(5 * 5), ncol = 5)) %>%
  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)
big_border <- fp_border(color = "red", width = 2)
small_border <- fp_border(color = "gray", width = 1)

myft <- 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

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
myft2 <- 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

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
ft <- flextable(head(airquality))
ft <- add_header_row(ft,
  top = TRUE,
  values = c("mesures", "temps"),
  colwidths = c(4, 2)
)
ft <- align(ft, i = 1, align = "center", part = "header")
ft <- width(ft, width = .75)
  • 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és
  • theme_tron_legacy() et theme_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
mon_theme <- function(x, ...) {
  x <- colformat_double(x, big.mark = "'", decimal.mark = ",", digits = 1)
  x <- set_table_properties(x, layout = "fixed")
  x <- border_remove(x)
  std_border <- fp_border(width = 1, color = "orange")
  x <- 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")
  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
ft <- flextable(head(iris))
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)

dat <- penguins %>%
  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

ft_pen <- flextable(dat) %>%
  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
ft <- flextable(head(airquality))
ft <- set_header_labels(ft,
  Solar.R = "Solar R (lang)",
  Temp = "Temperature (degrees F)", Wind = "Wind (mph)",
  Ozone = "Ozone (ppb)"
)
ft <- set_table_properties(ft, layout = "autofit", width = .8)
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() et add_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() et add_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() et add_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
ft <- add_header_row(
  x = ft, values = c("mesures de la qualité de l'air", "temps"),
  colwidths = c(4, 2)
)
ft <- theme_box(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
ft <- add_header_lines(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