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 :

  • des fonctions pour faciliter la gestion des bordures
  • des fonctions pour faciliter le formatage des contenus affichés des colonnes.

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),
  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()

unit

sex

indic_he

geo

time

values

PC

F

HLY_PC_0

AT

2016

67.9

PC

F

HLY_PC_0

BE

2016

75.8

PC

F

HLY_PC_0

BG

2016

86.0

PC

F

HLY_PC_0

CH

2016

67.4

PC

F

HLY_PC_0

CY

2016

81.1

PC

F

HLY_PC_0

CZ

2016

78.0

head(eu_countries_) %>% regulartable()

code

name

label

BE

Belgium

Belgium

BG

Bulgaria

Bulgaria

CZ

Czechia

Czechia

DK

Denmark

Denmark

DE

Germany

Germany (until 1990 former territory of the FRG)

EE

Estonia

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

unit

sex

geo

time

name

label

HLY_0

HLY_50

HLY_65

HLY_PC_0

HLY_PC_50

HLY_PC_65

LE_0

LE_50

LE_65

PC

F

AT

2016

Austria

Austria

NA

NA

NA

67.9

43.8

34.3

NA

NA

NA

PC

F

BE

2016

Belgium

Belgium

NA

NA

NA

75.8

58.1

52.1

NA

NA

NA

PC

F

BG

2016

Bulgaria

Bulgaria

NA

NA

NA

86.0

69.0

56.6

NA

NA

NA

PC

F

CH

2016

Switzerland

Switzerland

NA

NA

NA

67.4

50.4

42.7

NA

NA

NA

PC

F

CY

2016

Cyprus

Cyprus

NA

NA

NA

81.1

60.8

47.2

NA

NA

NA

PC

F

CZ

2016

Czechia

Czechia

NA

NA

NA

78.0

56.3

44.5

NA

NA

NA

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

BE

Belgium

2016

BG

Bulgaria

2016

CH

Switzerland

2016

CY

Cyprus

2016

CZ

Czechia

2016

DE

Germany

2016

DK

Denmark

2016

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

flex_data

Code pays

Pays

Années

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

AT

Austria

2016

BE

Belgium

2016

BG

Bulgaria

2016

CH

Switzerland

2016

CY

Cyprus

2016

CZ

Czechia

2016

DE

Germany

2016

DK

Denmark

2016

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, 
  j = c("F_0_DFLE",  "M_0_DFLE"),  
  suffix = " years", na_str = "-", digits = 1)

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

flex_data <- autofit(flex_data)
flex_data <- width(flex_data, j = 4:5, width = 1)
flex_data <- hline_top(flex_data, part="all", border = big_border )

flex_data

Code pays

Pays

Années

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

AT

Austria

2016

years

years

BE

Belgium

2016

years

years

BG

Bulgaria

2016

years

years

CH

Switzerland

2016

years

years

CY

Cyprus

2016

years

years

CZ

Czechia

2016

years

years

DE

Germany

2016

years

years

DK

Denmark

2016

years

years

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