NewsRoom

Construire, visualiser et télécharger des tableaux croisés avec Shinypivottabler

R&D 31 janvier 2021

Dans la famille des packages shiny développés par Datastorm, je demande maintenant la grande sœur : Shinypivottabler. Le package propose un module shiny permettant aux utilisateurs de construire, visualiser, et télécharger le tableau croisé de leurs rêves. Rien que ça !

Shinypivottabler est basé sur le package pivottabler (http://www.pivottabler.org.uk/), en amenant une surcouche pour son intégration et son utilisation en clique-bouton depuis une application shiny.

shinypivottabler vs rpivotTable ?

Le package rpivotTable (https://github.com/smartinsightsfromdata/rpivotTable) permet déjà de construire un tableau croisé via une application shiny en proposant un wrapper autour de la librairie javascript PivotTable.js. Le tout avec des fonctionnalités plutôt sympathiques comme :

  • la définition de notre table en drag’n’drop
  • la mise à disposition de nombreuses fonctions d’agrégation
  • la possibilité de visualiser la table et les graphiques interactifs correspondants

Cependant, avec l’utilisation d’une librairie javascript, toutes les données sont envoyées côté client, c’est-à-dire à la page web, et les calculs y sont également effectués. Quand on souhaite traiter un gros volume de données, ce n’est donc pas forcément l’outil le plus adapté car on risque de surcharger le navigateur et l’ordinateur de l’utilisateur.

Avec pivottabler, et donc shinypivottabler, les données et les calculs restent côté serveur, ce qui permet de traiter des tables plus volumineuses, et cela sans mettre à mal les ressources de nos utilisateurs, avec en bonus quelques fonctionnalités intéressantes :

  • la définition de nouvelles fonctions d’agrégation
  • le calcul d’indicateurs combinés
  • la customisation de la table générée et son exportation directement en excel

Installation

Le package est actuellement en phase de test et de validation. Il devrait donc arriver dans les prochaines semaines sur le CRAN. En attendant, vous pouvez l’installer directement depuis notre github https://github.com/datastorm-open :

if(!require(devtools)) install.packages("devtools")
devtools::install_github("datastorm-open/shinypivottabler")

Application de démonstration

Une application de démonstration est disponible

  • directement dans le package :
runApp(system.file("demo_app", package = "shinypivottabler"))

Utilisation

Le package se compose uniquement de deux fonctions définissant le module à insérer dans votre application shiny :

  • shinypivottablerUI : dans le script ui.R, avec l’identifiant du module à renseigner, et optionnellement deux paramètres permettant de définir les couleurs et la largeur des traits de l’interface utilisateur
  • shinypivottabler : dans la partie du server.R avec a minima :
    • l’identifiant du module (id)
    • ainsi que les données sur lesquelles on souhaite construire des tableaux croisés (data)
# minimal example
require(shinypivottabler)
require(shiny)
# create artificial dataset
n <- 1000000
data <- data.frame("gr1" = sample(c("A", "B", "C", "D"), size = n,
        prob = rep(1, 4), replace = T),
    "gr2" = sample(c("E", "F", "G", "H"), size = n,
        prob = rep(1, 4), replace = T),
    "value1" = 1:n,
    "value2" = n:1)
ui = shiny::fluidPage(
  shinypivottablerUI(id = "id")
)
server = function(input, output, session) {
  shiny::callModule(module = shinypivottabler,
    id = "id",
    data = data)
}
shiny::shinyApp(ui = ui, server = server)

Charte graphique

En complément de la paramétrisation possible des deux couleurs et de la largeur des traits de l’interface utilisateur dans shinypivottablerUI, vous pouvez modifier le thème présent par défaut pour le tableau croisé avec l’argument theme. Et dans tous les cas, l’utilisateur pourra modifier l’ensemble de ces options depuis le module avec le bouton Update theme.

# new default theme
theme <- list(
  fontName="arial",
  fontSize="1em",
  headerBackgroundColor = "#430838",
  headerColor = "rgb(255, 255, 255)",
  cellBackgroundColor = "rgb(255, 255, 255)",
  cellColor = "rgb(0, 0, 0)",
  outlineCellBackgroundColor = "rgb(192, 192, 192)",
  outlineCellColor = "rgb(0, 0, 0)",
  totalBackgroundColor = "#e6e6e6",
  totalColor = "rgb(0, 0, 0)",
  borderColor = "#000000"
)
# ui
ui = shiny::fluidPage(
  shinypivottablerUI(id = "id",
    app_colors = c("#e6e6e6", "#430838"),
    app_linewidth = 3
  )
)
# server
server = function(input, output, session) {
  shiny::callModule(module = shinypivottabler,
    id = "id",
    show_title = FALSE,
    theme = theme,
    data = data)
}


Définition de nouveaux indicateurs

Par défaut, les fonctions suivantes sont disponibles dans le module : SumMeanMinMaxStandard DeviationCount et Count Distinct pour les variables quantitatives, et seulement Count et Count Distinct pour les variables qualitatives. Et l’interface permet de combiner deux indicateurs (+-*, et /).

Vous pouvez si vous le souhaitez définir des nouvelles fonctions d’agrégation avec les arguments additional_expr_num (quantitative), additional_expr_char (qualitative) & additional_combine.

additional_expr_num = list(
  "Median" = "paste0('median(', target, ', na.rm = TRUE)')"
)
getmode <- function(v) {
   uniqv <- unique(v)
   uniqv[which.max(tabulate(match(v, uniqv)))]
}
additional_expr_char = list(
"Mode" = "paste0('getmode(', target, ')')"
)
additional_combine = c("Modulo" = "%%")
# ui
# server
server = function(input, output, session) {
  shiny::callModule(module = shinypivottabler,
    id = "id",
    additional_expr_num = additional_expr_num,
    additional_expr_char = additional_expr_char,
    additional_combine = additional_combine,
    data = data)
}

Next steps

Plusieurs axes d’améliorations sont déjà dans notre TO DO :

  • pouvoir sauvegarder et recharger une définition d’un tableau croisé
  • proposer des fonctionnalités graphiques
  • permettre l’affichage de nos indicateurs en %

> Retrouvez les autres packages développés par Datastorm sur notre github : https://github.com/datastorm-open