Module Initiation à l’écriture d’applications Shiny
20/02/2025
Ce diaporama de formation a été rédigé dans le but d’être le support visuel des formations dispensées au MASA.
Ces formations s’adressent à des agents qui ont suivi la formation R initialisation.
Elles sont données en présentiel sur une durée de trois jours, les modules de cette formation sont ajustables suivants le choix des agents.
Champ couvert par cette formation
Ce support couvre l’initation à l’écriture d’application Shiny dans l’environnement du Minsitère.
Pour information, ce module de la formation R-perfectionnement se décompose en :
Introduction
Créer une interface
Partie interface graphique
Partie serveur
Réactivité
Le programme complet
Ce module est orienté pour être utile aux agents du SSM MASA et se concentre sur une utilisation de R via RStudio qui est mise à disposition des agents sur la plateforme interne Cerise basée sur RStudio Workbench.
Pourquoi créer une interface graphique ?
⇒ Cela permet de pouvoir lancer un programme, modifier des paramètres, visualiser des résultats, sans avoir à manipuler de code
On utilise le package Shiny.
Ce package permet :
de séparer la partie interface de la partie traitement
de créer des interfaces web très variées et personnalisables
de déployer des applications web
Une application Shiny a vocation à être mise sous Gitlab et comporter 3 environnements (branches) :
Développement,
Recette,
Production
La création d’une application Shiny se fait en 2 étapes.
Interface graphique : créer et agencer les différents éléments (boutons, champs de saisie, affichage de graphiques ou tableaux, …)
Serveur : récupérer les paramètres saisies dans l’interface, écrire les traitements R, et afficher les résultats
ui <- fluidPage(….)
Il existe plusieurs manières de créer une page, suivant comment on veut la présenter : fluidPage, fixedPage, bootstrapPage, pageWithSidebar, …
On prend ici l’exemple d’une fluidPage
.
En paramètre de la page, on indique les éléments qu’elle va contenir.
Une page peut être découpée en « lignes » :
Chaque ligne peut être découpée en « colonnes » :
L’interface utilisateur (ui.R) est la vitrine de l’application. C’est une fenêtre dans laquelle l’utilisateur va « saisir » des informations : les inputs. Les valeurs des inputs sont définies par manipulation de widgets.
Les résultats (outputs) produits par l’application sont généralement affichés dans cette interface.
L’interface est une page Web « composée » par shiny.
Elle peut prendre plusieurs formes : la mise en page (layout). L’une des plus classiques est la sidebarLayout.
Pour permettre à l’utilisateur de saisir des données en entrée, on utilise des widgets. Les plus courants sont :
selectInput : liste déroulante
radioButtons : boutons radio
checkboxInput : case à cocher
sliderInput : bouton à déplacer sur une barre
numericInput : zone de saisie pour une variable numérique
textInput : zone de saisie pour une variable texte
actionButton : bouton pour effectuer une action
fileInput : bouton pour sélectionner un fichier
Voir http://shiny.rstudio.com/gallery/widget-gallery.html
Les widgets sont en fait des fonctions qui attendent plusieurs arguments. Les 2 premiers sont :
le nom du widget (inputId)
le label, c’est à dire le texte qui guidera l’utilisateur dans ses choix.
Exemple :
Chaque colonne contiendra des éléments :
Des inputs (actionButton, selectInput, textInput, fileInput, … )
Des outputs (tableOutput, plotOutput, downloadButton, …)
On indique en premier paramètre de la colonne la taille de celle-ci, sachant que la taille totale d’une ligne (somme des colonnes) est de 12.
Les différents objets finaux (input ou output) ont tous des paramètres différents, mais le premier est toujours le même, inputId pour les inputs, et outputId pour les output.
→ C’est cet identifiant qui permettra de faire le lien entre l’interface graphique et la partie serveur : la partie traitement (le serveur) peut ainsi récupérer les valeurs saisies dans les inputs et d’afficher les résultats dans les outputs.
Attention
Comme on va rapidement imbriquer beaucoup de couches d’éléments, il est très important de bien aérer et indenter son code.
Le package {shinyuieditor} permet de construire l’UI sans avoir à coder https://rstudio.github.io/shinyuieditor/ (version préliminaire)
Voir aussi le package {flexdashboard} pour construire des tableaux de bord avec du Rmarkdown https://rstudio.github.io/flexdashboard/articles/shiny.html
Exercice - partie Interface (ui)
Le but de cet exercice est de créer une interface pour afficher des statistiques simples sur des données.
Partie 1 – Interface
Récupérer dans un vecteur la liste des régions.
On va maintenant initialiser une page vide. Il nous faut 3 objets :
Exécutez le programme.
(suite sur la prochaine slide…)
Exercice - partie Interface (ui)
Créez un tableOutput.
Exécutez le programme.
Exécutez le programme.
On crée une fonction server
, qui a au moins 2 paramètres :
server <- function(input, output) { ... }
Dans le corps de la fonction, on peut placer du code R traditionnel.
Le fichier server.R contient les instructions nécessaires pour construire l’application et afficher les résultats dans l’interface.
Plus précisément, il contient le code R à exécuter pour effectuer tous les traitements nécessaires à l’application :
Chargement de données ;
Calculs ; sélection, extraction, … ;
Traçage de graphique, affichage de tableau ;
Il y a 2 particularités principales liée à Shiny dans le code du serveur :
Les références aux inputs/outputs : récupérer une valeur saisie, afficher tel tableau à l’écran, …
Les éléments dits « réactifs » : on peut déclencher un traitement particulier sur une action de l’utilisateur
Pour récupérer une valeur saisie par l’utilisateur, par exemple un champ de texte, on utilise le paramètre input, avec l’identifiant du champ de saisie (inputId)
partie ui :
textInput(inputId="champ_saisie", label= "Saisir :")
partie server :
ma_chaine <- input$champ_saisie
Pour placer un tableau ou un graphique dans l’interface, on affecte à l’output la table concernée, en lui appliquant une fonction appelée « render »
partie ui :
tableOutput(outputId="resultat")
partie server :
output$resultat <- renderTable({ data })
Il existe des fonction render pour chaque type d’output (renderTable, renderPlot, renderText, renderImage, …
).
Dans le paramètre de la fonction, dans les accolades, on peut mettre simplement un objet R, ou un bloc de code :
renderTable({ head(data, n=10 })
De la même façon que nous insérons des données dans l’application via les widget, il faut s’occuper d’afficher à l’écran les résultats des traitements.
On utilise pour cela les fonctions render* :
renderPlot ;
renderImage ;
renderTable, ...
Les fonctions render* coté server et *Output coté ui vont de pair :
ui.R | server.R |
---|---|
imageOutput | renderImage |
plotOutput | renderPlot |
tableOutput | renderTable |
DTOutput | renderDT |
textOutput | renderText |
uiOutput | renderUI |
verbatimTextOutput | renderPrint |
L’objet input$num sera automatiquement modifié :
Avec Shiny, on peut déclencher des traitements en fonction des actions de l’utilisateur.
« La réactivité d’une application, c’est sa capacité à mettre à jour ses éléments suite à l’action d’un utilisateur. »
On utilise des « observers » :
observe → déclenche un traitement quelle que soit l’action
observeEvent → déclenche un traitement quand l’utilisateur modifie un input précis
On peut rajouter du CSS, du JavaScript, …
Détails des fonctions : https://shiny.rstudio.com/reference/shiny/latest/
Des possibilités infinies (voir cette galerie inspirante) : https://shiny.rstudio.com/gallery/
Exercice - partie Server
L’interface est prête, on va maintenant écrire les traitements réalisés par le programme, c’est-à-dire la partie serveur.
5) Dans la fonction server, créez un observeEvent qui se déclenche quand on clique sur le bouton.
Filtrez la table sur la région choisie via la liste déroulante (affectez le résultat dans une nouvelle table).
En utilisant summarise, créer une table contenant, par département, la moyenne, le maximum, le minimum et la somme des populations (Pop_mun_2011). Affectez cette table à l’outputId de l’interface pour l’afficher (en utilisant renderTable).
Exécutez le programme.
Exercice - partie Server
A l’aide de conditions, créez la table sur la donnée choisie (Pop_mun_2011, Altitude ou Superficie).
Exécutez le programme.
Dans l’observeEvent, remplacer l’inputId du bouton, par un vecteur contenant les inputId des 2 listes déroulantes.
Exécutez le programme.
La mise à jour du tableau se fait maintenant dès qu’on change une valeur des listes déroulantes. Vous pouvez supprimer le bouton dans l’interface.
https://thinkr.fr/pdf/shiny-french-cheatsheet.pdf
https://shiny.rstudio.com/tutorial/written-tutorial/lesson1/