Chapitre 4 Applications web avec Shiny
Shiny
est un package R qui permet la création simple d’applications web intéractives depuis R. Cette partie provient essentiellement du tutoriel de Benoît Thieurmel disponible ici : https://github.com/datastorm-open/tuto_shiny_rennes.
4.1 Une première application
Créer un répertoire pour l’application avec RStudio
File -> New Project -> New Directory -> Shiny Web Application
Choisir une application Multiple File.
Si cette option n’est pas disponible (ça peut dépendre des versions de Rstudio), on pourra utiliser
File -> New File -> Shiny Web App -> Multiple File
Deux fichier sont automatiquement générés : ui.R
et server.R
. Lancer l’application en cliquant sur le bouton Run App
.
- Changer le titre de l’application. On pourra l’appeler My first application.
- Mettre à jour et vérifier que le titre a bien été changé.
4.2 Input - output
On garde la même application. On ne s’intéressera pas à la structure dans cette partie, on veut simplement ajouter
- des nouveaux inputs dans le
sidebarPanel
, après lesliderInput
. On n’oubliera pas de séparer les inputs par des virgules; - des nouveaux outputs dans le
mainPanel
, après leplotOutput
. Là encore, on n’oubliera pas de séparer les outputs par des virgules.
Pour résumer on souhaite une colonne avec tous les inputs et une autre avec tous les outputs.
Ajouter dans
ui.R
une entrée qui permette de changer la couleur de l’histogramme. On pourra utiliserselectInput(inputId = "color", label = "Couleur :", choices = c("Rouge" = "red", "Vert" = "green", "Bleu" = "blue"))
Ajouter une sortie qui permette de visualiser le summary du jeu de données
faithful
. On pourra utiliser# ui.R verbatimTextOutput("...") # server.R $... <- renderPrint({ outputsummary(...) })
Exercice 4.1 (Ajouter des inputs/outputs) Ajouter des entrées/sorties à votre application pour
proposer à l’utilisateur de choisir un titre pour l’histogramme (utiliser
textInput
dans l’ui et l’optionmain
dans hist);choisir la variable de
faithful
à représenter dans l’histogramme avec unradioButtons
ayant pour choixcolnames(faithful)
;visualiser le jeu de données entier (
renderDataTable
&dataTableOutput
);ajouter un text sous l’histogramme qui indique le nombre de classes (
renderText
etpaste
dans server,textOutput
dans ui);remplacer le
selectInput
du choix de la couleur par uncolourInput
(utiliser la package colourpicker);exporter le graphe (
downloadButton
&jpeg
).
L’application demandée pourra ressembler à
Elle est également disponible ici https://input-output-rouviere-shiny.apps.math.cnrs.fr/.
4.3 Structurer l’application
On considère l’application app_structure disponible ici. C’est quasiment la même que précédemment avec un navbarPage
qui définit
- un onglet Data pour visualiser les données (table + summary)
- un onglet Visualisation : inputs + histogramme.
Exercice 4.2 (Structurer son application) On conserve l’application précédente.
Dans l’onglet Data utiliser
navlistPanel
pour séparer lesummary
et la tabletable
en deux onglets :# rappel de la structure (ui.R) navlistPanel( "Title of the structure", tabPanel("Title of the tab", ... "(content of the tab)"), tabPanel("Title of the tab", ... "(content of the tab)") )
Dans l’onglet Visualization changer
sidebarLayout
-sidebarPanel
-mainPanel
par unfluidRow
à 2 colonnes :- 1/4 : pour le
sidebarPanel
- 3/4 : pour le
mainPanel
.
fluidRow( column(width = 3, ...), # column 1/4 (3/12) column(width = 9, ...) # column 3/4 (9/12) )
Indication : utiliser
wellPanel
pour la colonne de gauche.- 1/4 : pour le
Ajouter un bloxplot dans l’onglet visualisation (même variable et même couleur). On pourra également utiliser
tabsetPanel
pour avoir deux onglets pour l’histogramme et le boxplot.# rappel de la structure (ui.R) tabsetPanel( tabPanel("Title of the tab", ... "(content of the tab)"), tabPanel("Title of the tab", ... "(content of the tab)") )
L’application demandée pourra ressembler à
Elle est également disponible ici https://structure-rouviere-shiny.apps.math.cnrs.fr/.
Pour aller plus loin : faire la même application avec shinydashboard (https://rstudio.github.io/shinydashboard/).
4.4 Ajout de graphes interactifs
Dans l’application précédente, remplacer l’histogramme et la boxplot par des graphes javascript réalisés avec rAmCharts. On pourra utiliser
# server.R
$distPlot <- renderAmCharts({...})
output
# ui.R
amChartsOutput("...")
L’application demandée pourra ressembler à
Elle est également disponible ici https://interactifs-rouviere-shiny-2.apps.math.cnrs.fr/.
4.5 Reactive, isolation, observe, html, …
Garder la même application et
ajouter un
actionButton
combiné à unisolate
pour mettre à jour l’application uniquement lorsque l’utilisateur clique sur le bouton.Utiliser
observeEvent
pour forcer l’apparition de l’histogramme lorsqu’on met à jour l’application. On pourra utiliser# think to add "session" shinyServer(function(input, output, session) # an id tabsetPanel(id = "viz", tabPanel("Histogram", ... # and finaly observeEvent(input$go, { updateTabsetPanel(session, inputId = "viz", selected = "Histogram") })
Utiliser
reactive
pour stocker la variable sélectionnée# Example of reactive <- reactive({ data ... }) $plot <- renderPlot({ output<- data() x ... })
Ajouter un titre en bleu sur le jeu de données. On pourra utiliser
h1
h1("Dataset", style = "color : #0099ff;text-align:center")
Ajouter un troisième onglet pour présenter un résumé de votre Uinersité, avec un logo de l’institution et un lien vers son site web.
Pour aller plus loin : changer le thème de l’application avec un fichier de style
.css
. On pourra par exemple utiliser bootswatch http://bootswatch.com/3.
L’application finale pourra ressembler à
Elle est également disponible ici https://plus-loin-rouviere-shiny-2.apps.math.cnrs.fr/.
4.6 Exercices complémentaires
Exercice 4.3 (Une application simple descriptive) On considère le jeu de données SAheart du package bestglm.
A l’aide du package rAmCharts, représenter les histogrammes des variables quantitatives du jeu de données ainsi que les boxplots de ces variables en fonction de la variable chd.
library(bestglm) library(rAmCharts) amHist(SAheart$adiposity,freq=FALSE,xlab="adiposity")
amBoxplot(adiposity~chd,data=SAheart)
Créer une application shiny avec shinydashboard qui permette de
- choisir une variable parmi les variables quantitatives du jeu de données. On pourra utiliser radioButtons avec l’argument
=names(SAheart)[sapply(SAheart,class)=="numeric"] choices
- visualiser l’histogramme, puis le boxplot en fonction de chd de la variable sélectionnée. Ces graphiques devront être faits avec rAmCharts. On pourra utiliser amChartsOutput. L’application demandée pourra ressembler à
Elle est disponible ici https://lrouviere.shinyapps.io/DESC_APP.
Exercice 4.4 (Stations velib à Rennes) Réaliser une application qui permette de visualiser les stations velib à Rennes. Elle pourra être du même genre que celle-ci :
On peut avoir une meilleure vision ici : https://lrouviere.shinyapps.io/velib/. On récupérera les données sur le site de Rennes métropole : https://data.rennesmetropole.fr/explore/dataset/etat-des-stations-le-velo-star-en-temps-reel/export/