Le package shiny
permet de développer très facilement des applications web à partir de R
. Grâce à cette librairie, et d’autres librairies R
dédiés à la réalisation de graphique, il est ainsi possible de générer des tableaux de bord, introduisant même des méthodes statistiques approfondies.
Pour cela, nous allons utiliser le jeu de données mtcars
présent sous R.
Une application shiny
nécessite deux fichiers nommés spécifiquement au minimum :
server.R
: définissant les opérations à réaliser lors de la création de la page et lors des différentes interactions de l’utilisateur ;ui.R
: définissant l’interface utilisateur (UI signifiant User Interface), avec les différentes parties telles que le titre, les différentes boutons ou sélecteurs et les graphiques et/ou textes.Dans un nouveau répertoire, créer les deux fichiers R
avec le contenu suivant :
server.R
:library(shiny)
shinyServer(function(input, output) {})
ui.R
:library(shiny)
shinyUI(fluidPage(
titlePanel("Première application")
))
Une fois ces fichiers enregistrés, pour voir le résultat, vous pouvez soit cliquer sur Run App
en haut à droite de l’éditeur de texte, soit exécuter la commande runApp()
dans la console. Vous devriez voir une fenêtre avec juste le titre qui s’affiche.
On va ajouter un nuage de points entre la variable mpg
(consommation en Miles/US Gallon) et wt
(poids) du jeu de données mtcars
. Il faut donc modifier les deux fichiers :
server.R
:library(shiny)
shinyServer(function(input, output) {
output$nuage <- renderPlot({
plot(mpg ~ wt, data = mtcars, main = "Consommation en fonction du poids")
})
})
ui.R
:library(shiny)
shinyUI(fluidPage(
titlePanel("Première application"),
plotOutput("nuage")
))
Que faut-il noter ?
nuage
qui sera une sortie graphique (plotOutput
) ;output$nuage
) comme étant un rendu graphique (renderPlot
), dans lequel on met du code R
permettant de faire un graphique. Le code ici présent est tou ) fait classique.On ajoute ici un bouton permettant de sélectionner la variable de l’axe \(x\) (wt
dans notre exemple). Nous allons laisser à l’utilisateur le choix entre wt
, hp
(puissance) et disp
(cylindrée). Il faut donc modifier les deux fichiers :
server.R
:library(shiny)
shinyServer(function(input, output) {
output$nuage <- renderPlot({
plot(mtcars$mpg ~ mtcars[,input$choix], main = "Consommation")
})
})
ui.R
:library(shiny)
shinyUI(fluidPage(
titlePanel("Première application"),
selectInput("choix", "Abscisse", c("wt", "hp", "disp")),
plotOutput("nuage")
))
Que faut-il noter ?
selectInput
) nommée choix
, avec un titre (Abscisse
) et donc une liste de choix (c("wt", "hp", "disp")
) ;input$choix
) sera une chaîne de caractère parmi les trois proposées. La commande mtcars[,input$choix]
renverra donc bien le vecteur de la colonne choisie par l’utilisateur.On souhaite ajouter maintenant le calcul automatique de la moyenne des deux variables sélectionnées. Pour cela, nous allons modifier les fichiers comme suit :
server.R
:library(shiny)
shinyServer(function(input, output) {
output$nuage <- renderPlot({
plot(mtcars$mpg ~ mtcars[,input$choix], main = "Consommation")
})
output$resumeMpg <- renderText({
paste("Moyenne mpg :", mean(mtcars$mpg, na.rm = T))
})
output$resumeVar <- renderText({
paste("Moyenne", input$choix, ":", mean(mtcars[,input$choix], na.rm = T))
})
})
ui.R
:library(shiny)
shinyUI(fluidPage(
titlePanel("Première application"),
selectInput("choix", "Abscisse", c("wt", "hp", "disp")),
plotOutput("nuage"),
textOutput("resumeMpg"),
textOutput("resumeVar")
))
Que faut-il noter ?
textOutput
), nommées resumeMpg
pour la moyenne de la consommation, et resumeVar
pour la moyenne de l’autre variable ;Il est prévu une mise en page en deux zones :
On ne modifie ici que le fichier d’interface.
ui.R
library(shiny)
shinyUI(fluidPage(
titlePanel("Première application"),
sidebarLayout(
sidebarPanel(
selectInput("choix", "Abscisse", c("wt", "hp", "disp")),
textOutput("resumeMpg"),
textOutput("resumeVar")
),
mainPanel(
plotOutput("nuage")
)
)
))
Que faut-il noter ?
sidebarLayout
permet donc de définir cette séparation en deux parties (environ 1/3-2/3). Elle doit contenir deux choses :
sidebarPanel
qui contient les éléments qui seront donc à gauche par défautmainPanel
qui sera celle à droite et prenant le plus de placesidebarPanel
à droite avec sidebarLayout(position = "right", ..., ...)
Dans la partie interface, il est possible de créer un système d’onglet avec :
shinyUI(fluidPage(
tabsetPanel(
tabPanel("Panel1",
titlePanel("titre Panel 1")
# autres commandes UI (par exemple sidebarLayout)
),
tabPanel("Panel2",
titlePanel("titre Panel 2")
# idem
)
# autres onglets possibles
)
))
Le travail fait précédemment (ce qu’il y a dans le sidebarLayout()
).
On veut compléter notre application avec une partie pour l’analyse de variables qualitatives. Vous devez donc faire en sorte que :
cyl
, vs
, am
, gear
et carb
On veut croiser les variables qualitatives :