La version 0.9
du package ‘flextable’ amène la possibilité de produire les tableaux dans des documents RTF.
L’intérêt de supporter ce format est de pouvoir satisfaire les communautés qui sont contraintes d’utiliser ce format, c’est à dire essentiellement dans le milieu pharmaceutique à notre connaissance.
utilisations
Deux méthodes peuvent être utilisées pour embarquer les flextable dans un fichier RTF.
On peut utiliser la fonction save_as_rtf()
qui produit un fichier RTF à partir d’un ou plusieurs flextable.
La fonction save_as_rtf()
est une fonction utilitaire du package ‘flextable’.
La documentation de la fonction peut être consultée
à cette adresse : https://davidgohel.github.io/flextable/reference/save_as_rtf.html.
Si la sortie n’est pas adaptée à vos besoins, vous pouvez utiliser
les fonctions du package ‘officer’ dédiées à la production de fichiers
RTF, c’est à dire officer::rtf_doc()
et officer::rtf_add()
.
La documentation de rtf_add()
peut être consultée
à cette adresse : https://davidgohel.github.io/officer/reference/rtf_add.html.
Nous allons montrer dans la suite l’utilisation de save_as_rtf()
et le résultat produit.
Le tableau pour l’illustration
L’actualité française a mis en évidence quelques jeux de données publics sur les premiers ministres de la cinquième république et les utilisations de l’article 49-3. Nous avons joué avec des données pour en produire un tableau simple avec flextable.
Les données sont disponible directement au format rds et le script permettant d’obtenir ces données est disponible dans le fichier src-history-49-3.R.
x <- readRDS("history-49-3.RDS")
head(x)
#> couleur name n_nominations debut fin duration
#> 1 CENT Élisabeth Borne 1 2022-05-16 2023-03-25 313
#> 2 CENT Jean Castex 1 2020-07-03 2022-05-16 682
#> 3 CENT Édouard Philippe 2 2017-05-15 2020-07-03 1145
#> 4 GAU Bernard Cazeneuve 1 2016-12-06 2017-05-10 155
#> 5 GAU Manuel Valls 2 2014-03-31 2016-12-06 981
#> 6 GAU Jean-Marc Ayrault 2 2012-05-15 2014-03-31 685
#> n_eng_resp n_text n_censor_motion
#> 1 11 3 14
#> 2 NA NA NA
#> 3 1 1 2
#> 4 NA NA NA
#> 5 6 2 3
#> 6 NA NA NA
Préparations
On déclare d’abord quelques paramétrages généraux pour flextable.
set_flextable_defaults(
font.family = "Open Sans", font.color = "#333333",
big.mark = "", fmt_date = "%Y", na_str = "",
theme_fun = theme_vanilla)
Le bord politique du ministre est indiqué avec un cercle dont la couleur est la couleur utilisée en général dans les médias. On doit d’abord préparer ces formes, on utilise le package ‘grid’ pour cela.
library(grid)
library(dplyr)
x$couleur <- mapply(function(z) {
col <- case_when(
z %in% "GAU" ~ "#FF8080",
z %in% "DTE" ~ "#143c77",
z %in% "CENT" ~ "#ff9900",
TRUE ~ "transparent"
)
circleGrob(gp = gpar(fill = col, col = "transparent"))
}, z = x$couleur, SIMPLIFY = FALSE, USE.NAMES = FALSE)
Le flextable
On peut maintenant définir le tableau avec les fonctions de flextable.
z <- flextable(
data = x,
col_keys = c("name", "couleur", "exercice", "n_eng_resp", "n_text", "n_censor_motion")) |>
mk_par(j = "exercice",
value = as_paragraph(
as_i(debut), as_i("-"), as_i(fin),
as_i(as_bracket(duration, p = " (", s = " jours)")))) |>
mk_par(j = "couleur", value = as_paragraph(grid_chunk(couleur, width = .15, height = .15))) |>
align(j = "name", align = "right", part = "all") |>
align(j = c("n_eng_resp", "n_text", "n_censor_motion"), align = "center", part = "all") |>
set_header_labels(name = "Premier ministre",
period = "Période",
couleur = "",
n_eng_resp = "Recours\nau 49-3",
n_text = "Textes\nconcernés",
n_censor_motion = "Motions\nde censure",
longeur = "Nombre de jours\nen fonction") |>
autofit() |>
width(j = "couleur", width = .3)
z
Premier ministre | Recours | Textes | Motions | ||
---|---|---|---|---|---|
Élisabeth Borne | 2022-2023 (313 jours) | 11 | 3 | 14 | |
Jean Castex | 2020-2022 (682 jours) | ||||
Édouard Philippe | 2017-2020 (1145 jours) | 1 | 1 | 2 | |
Bernard Cazeneuve | 2016-2017 (155 jours) | ||||
Manuel Valls | 2014-2016 (981 jours) | 6 | 2 | 3 | |
Jean-Marc Ayrault | 2012-2014 (685 jours) | ||||
François Fillon | 2007-2012 (1820 jours) | ||||
Dominique de Villepin | 2005-2007 (712 jours) | 1 | 1 | 0 | |
Jean-Pierre Raffarin | 2002-2005 (1121 jours) | 2 | 2 | 2 | |
Lionel Jospin | 1997-2002 (1799 jours) | ||||
Alain Juppé | 1995-1997 (747 jours) | 2 | 2 | 2 | |
Édouard Balladur | 1993-1995 (773 jours) | 1 | 1 | 1 | |
Pierre Bérégovoy | 1992-1993 (361 jours) | 3 | 3 | 1 | |
Edith Cresson | 1991-1992 (323 jours) | 8 | 4 | 2 | |
Michel Rocard | 1988-1991 (1100 jours) | 28 | 13 | 5 | |
Jacques Chirac | 1986-1988 (782 jours) | 8 | 7 | 7 | |
Laurent Fabius | 1984-1986 (611 jours) | 4 | 2 | 1 | |
Pierre Mauroy | 1981-1984 (1153 jours) | 7 | 5 | 6 | |
Raymond Barre | 1976-1981 (1722 jours) | 8 | 5 | 13 | |
Jacques Chirac | 1974-1976 (821 jours) | ||||
Pierre Messmer | 1972-1974 (691 jours) | ||||
Jacques Chaban-Delmas | 1969-1972 (1111 jours) | ||||
Maurice Couve de Murville | 1968-1969 (345 jours) | ||||
Georges Pompidou | 1962-1968 (2279 jours) | 6 | 2 | 4 | |
Michel Debré | 1959-1962 (1192 jours) | 4 | 2 | 4 |
Les annotations
Il reste à ajouter quelques annotations et le tableau pourra être envoyé dans un document RTF.
z <- add_header_lines(z,
values = as_paragraph(
as_chunk("Historique des recours au 49-3 pendant la V république",
prop = fp_text_default(font.size = 13, bold = TRUE)
))
) |>
footnote(i = 1, j = 1, ref_symbols = "(1)",
part = "header",
value = as_paragraph(
as_chunk(" source : "),
as_i("https://www.assemblee-nationale.fr")
)
) |>
footnote(i = 1, j = 1, ref_symbols = "(2)",
part = "header",
value = as_paragraph(
as_chunk(" source : "),
as_i("https://www.politiquemania.com/longevite-premier-ministre.html")
)) |>
footnote(i = 2, j = c(4, 6), ref_symbols = "(3)",
part = "header",
value = as_paragraph(
as_chunk("Fréquence ")
)) |>
footnote(i = 2, j = 5, ref_symbols = "(4)", inline = TRUE,
part = "header",
value = as_paragraph(
as_chunk("Nombre de cas")
)) |>
hline(i = 1, part = "header", border = fp_border_default(width = 0))
Production du RTF
Parce que le tableau est assez large, nous utilisons une orientation
‘paysage’ ; l’entête et le pied de page sont aussi enrichis de
quelques informations dont une numérotation automatique des pages.
Ces paramétrages sont réalisés grâce à la fonction officer::prop_section()
.
library(officer)
sect_properties <- prop_section(
page_size = page_size(
width = 8.3, height = 11.7, orient = "landscape"
),
header_default = block_list(fpar("flextable and RTF")),
footer_default = block_list(fpar("page ", run_word_field(field = "PAGE \\* MERGEFORMAT"))),
page_margins = page_mar(bottom = .6, top = .6, right = .5, left = .5)
)
L’appel à la fonction save_as_rtf()
permet de finalement produire le
fichier RTF.
save_as_rtf(
"Recours au 49-3" = z,
pr_section = sect_properties,
path = "49-3.rtf")
Suivez nous: - Sites recommandés: R-bloggers R weekly Twitter #rstats Jobs for R-users