Les nouveautés du package flextable 0.4.6

Clémentine

2018/12/05

De nouvelles fonctions pour le package flextable sont disponibles depuis sa mise à jour le 31/09/2018. Ce post illustre deux nouvelles fonctionnalités :

Pour l’illustration, on va utiliser des données provenant d’Eurostat.

Nous allons avoir besoin de charger quelques packages :

library(eurostat)
library(tidyr)
library(dplyr)
library(flextable)
library(officer)
library(magrittr)

Importons d’abord un jeu de données en utilisant le package eurostat.

raw_data <- get_eurostat(
  id = "hlth_hlye", time_format = "num", 
  filters = list(time = 2016, 
                 indic_he = c("F_0_DFLE", "M_0_DFLE")),
  stringsAsFactors = FALSE)

eu_countries_ <- bind_rows(
    eu_countries, ea_countries, 
    efta_countries, eu_candidate_countries) %>% 
  distinct()

Voici à quoi ressemblent les données importées :

head(raw_data) %>% regulartable()

indic_he

geo

time

values

F_0_DFLE

AT

2016.000

57.100

F_0_DFLE

BE

2016.000

63.800

F_0_DFLE

BG

2016.000

67.500

F_0_DFLE

CH

2016.000

57.700

F_0_DFLE

CY

2016.000

68.800

F_0_DFLE

CZ

2016.000

64.000

head(eu_countries_) %>% regulartable()

code

name

BE

Belgium

BG

Bulgaria

CZ

Czech Republic

DK

Denmark

DE

Germany

EE

Estonia

Utilisons la fonction spread pour transformer les données en non tidy et faciliter l’affichage.

dat <- raw_data %>% 
  left_join(eu_countries_, by = c("geo" = "code")) %>% 
  spread(indic_he, values)

head(dat) %>% regulartable()

geo

time

name

F_0_DFLE

M_0_DFLE

AT

2016.000

Austria

57.100

57.000

BE

2016.000

Belgium

63.800

63.700

BG

2016.000

Bulgaria

67.500

64.000

CH

2016.000

Switzerland

57.700

61.000

CY

2016.000

Cyprus

68.800

67.500

CZ

2016.000

Czech Republic

64.000

62.700

Et maintenant on va créer un flextable :

flex_data <- head(dat, n=8) %>% 
  flextable(col_keys = c("geo", "name", "time", "F_0_DFLE", "M_0_DFLE"))

flex_data <- set_header_labels(
  flex_data, geo = "Code pays", time = "Années", name = "Pays",
  F_0_DFLE = "\U2640", M_0_DFLE = "\U2642" )

flex_data <- add_header(flex_data, geo = "Code pays", time = "Années", name = "Pays", 
    F_0_DFLE = "Nombre d'années de vie en bonne santé à la naissance", 
    M_0_DFLE = "Nombre d'années de vie en bonne santé à la naissance" ,
    top = TRUE) 

flex_data <- merge_h(flex_data, part = "header")
flex_data <- merge_v(flex_data, part = "header")


flex_data <- align(flex_data, j = c("geo", "name"), align = 'center', part = "all")
flex_data <- align(flex_data, j = c("time", "F_0_DFLE",  "M_0_DFLE"), 
                   align = 'right', part = "all")
flex_data <- padding(flex_data, padding.left = 5, padding.right = 5)

flex_data

Code pays

Pays

Années

Nombre d'années de vie en bonne santé à la naissance

AT

Austria

2016.000

57.100

57.000

BE

Belgium

2016.000

63.800

63.700

BG

Bulgaria

2016.000

67.500

64.000

CH

Switzerland

2016.000

57.700

61.000

CY

Cyprus

2016.000

68.800

67.500

CZ

Czech Republic

2016.000

64.000

62.700

DE

Germany

2016.000

67.300

65.300

DK

Denmark

2016.000

60.300

60.300

Les nouvelles fonctions intégrées au package colformat_*, vline, hline ont été créées dans le but de faciliter la mise en forme aussi bien des regulartables que des flextables.

hline et vline

Commençons par modifier les bordures à l’aide des fonctions hline et vline. Ces fonctions vont permettre de mettre en forme les interlignes horizontales et verticales du tableau. Il est possible de choisir la partie du tableau concernée par les modifications grâce au paramètre part =, soit “all”, “body”, “header” ou “footer”.

dash_border <- fp_border(color = "gray", style = "dashed")
big_border <- fp_border(color = "black", width = 2)

flex_data <- vline(x= flex_data, j = 1:4, border = dash_border ,part = "all")
flex_data <- hline(x= flex_data, border = dash_border, part = "body")
flex_data <- hline_bottom(x = flex_data, border = big_border, part = "body")

flex_data

Code pays

Pays

Années

Nombre d'années de vie en bonne santé à la naissance

AT

Austria

2016.000

57.100

57.000

BE

Belgium

2016.000

63.800

63.700

BG

Bulgaria

2016.000

67.500

64.000

CH

Switzerland

2016.000

57.700

61.000

CY

Cyprus

2016.000

68.800

67.500

CZ

Czech Republic

2016.000

64.000

62.700

DE

Germany

2016.000

67.300

65.300

DK

Denmark

2016.000

60.300

60.300

colformat_*

Avant la dernière mise à jour, pour modifier l’affichage des données (quelle que soit la ligne ou la colonne) d’un flextable, comme supprimer les décimales pour la colonne années, ajouter une image, etc., nous pouvions utiliser la fonction display. Pour l’affichage des données d’un regulartable (uniquement par colonnes), nous pouvions utiliser la fonction set_formatter.

flex_data <- display( 
  flex_data, 
  col_key = "time",
  pattern = "{{value}}",
  formatters = list(
    value ~ sprintf("%.0f", time)
    )
  )
flex_data

Apparement, utiliser display ou set_formatter c’est complexe. Plusieurs questions ont été posées sur stackoverflow-flextable et nous avons vu apparaître le besoin d’une fonction plus simple d’utilisation.

Ces fonctions sont très puissantes mais la majorité des besoins utilisateurs sont simples et devraient être possible avec peu de code. L’exemple ci-dessus le met plutôt bien en évidence, il y a beaucoup de code à taper alors que l’ordre à donner est simple: La colonne time doit être formatée avec l’appel sprintf("%.0f", time).

Afin d’offrir une fonction de formatage plus simple à utiliser et qui marche avec les flextable et regulartable, les fonctions colformat_* ont été créées.

Les fonctions colformat_* permettent de mettre facilement en forme le contenu des colonnes. Si plusieurs colonnes vont être modifiés de la même manière, il est possible de le faire dans la même instruction colformat_*.

L’option suffix = nous permet d’ajouter une valeur supplementaire à toutes les modalités d’une colonne, ici, nous ajoutons le suffixe years aux variables numeriques F_0_DFLE et M_0_DFLE.

Les options big.mark = et digits = modifient l’apparence des modalités numériques, big.mark = indiquera le séparateur des milliers et digits = permettra de choisir le nombre de chiffres après la virgule qui sera affiché.

flex_data <- colformat_num(x = flex_data, 
  col_keys = c("F_0_DFLE",  "M_0_DFLE"),  
  suffix = " years", na_str = "-", digits = 1)

flex_data <- colformat_num(x = flex_data, 
  col_keys = "time", digits = 0, big.mark = "")

flex_data <- autofit(flex_data)
flex_data <- width(flex_data, j = 4:5, width = 1)

flex_data

Code pays

Pays

Années

Nombre d'années de vie en bonne santé à la naissance

AT

Austria

2016

57.1 years

57.0 years

BE

Belgium

2016

63.8 years

63.7 years

BG

Bulgaria

2016

67.5 years

64.0 years

CH

Switzerland

2016

57.7 years

61.0 years

CY

Cyprus

2016

68.8 years

67.5 years

CZ

Czech Republic

2016

64.0 years

62.7 years

DE

Germany

2016

67.3 years

65.3 years

DK

Denmark

2016

60.3 years

60.3 years

Merci aux utilisateurs pour leur feedback, à plus tard pour d’autres news.