Débuter avec Shiny grâce à Rmarkdown

Débuter Shiny avec Rmarkdown

Pour toutes celles et ceux qui maîtrisent Rmarkdown, et qui aimeraient bien, à présent, apprendre à utiliser shiny (pour créer de belles applications web) mais qui appréhendent l’apprentissage de cette nouvelle technologie, je vous conseille de commencer par utiliser Shiny dans RMarkdown !

Parce que oui, c’est possible d’intégrer une application shiny dans Rmarkdownn!

Je vous montre cela en pas à pas.

Table des matières

Obtenir un template Rmarkdown-Shiny

Pour cela : File –> New File –> Rmarkdown –> Shiny.

 

OUvrir un template shiny dans Rmarkdown

Cela vous permet d’obtenir un template Rmarkdown, avec une particularité au niveau de l’en-tête : l’élément runtime: shiny.

Cet élément s’accompagne également de l’apparition d’un bouton Run Document, à la place bouton Knit.

L'en tête du template Rmarkdown avec shiny

Obtenir le rendu du template Rmarkdown-shiny

Pour obtenir le rendu, cliquez sur le bouton Run Document, ou utilisez le raccourci CTRL + MAJ + K.

Le document, contenant l’application shiny, va être généré dans le Viewer de la fenêtre de droite de RStudio (ou dans une page de navigateur) ; il comporte deux parties interactives :

Applications shiny dans Rmarkdown

Remarque : si le document s’est ouvert dans une page internet, plutôt que dans le viewer, vous pouvez aller dans Tool –> Global Option- Rmarkdown –> Show output preview in –> Viewer Pane

Option de R markdown

La première partie interactive permet de modifier l’apparence d’un graphique en changeant :

  • la valeur du nombre de classes (bin) de l’histogramme
  • un paramètre de la courbe de densité

 

La seconde partie interactive est plus complexe. Elle permet de générer des données, de les représenter, d’en faire une description et de les afficher dans une table, en choisissant:

  • le type de distribution
  • le nombre d’observations

Observer et comprendre le code shiny

Inputs et outputs

En parcourant le template vous allez facilement identifier le code de la première partie interactive (la seconde est générée par une application Shiny située dans un autre répertoire, nous n’allons donc pas nous en occuper).

Voici ce code de cette première partie interactive:

inputPanel(
  selectInput("n_breaks", label = "Number of bins:",
              choices = c(10, 20, 35, 50), selected = 20),
  
  sliderInput("bw_adjust", label = "Bandwidth adjustment:",
              min = 0.2, max = 2, value = 1, step = 0.2)
)

renderPlot({
  hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks),
       xlab = "Duration (minutes)", main = "Geyser eruption duration")
  
  dens <- density(faithful$eruptions, adjust = input$bw_adjust)
  lines(dens, col = "blue")
}) 

Les inputs (les caractéristiques de l’histogramme que nous pouvons modifier) sont gérées par la fonction inputPanel(). Et les outputs (l’histogramme) sont gérés par la fonction renderPlot().

inputs et outputs shiny

L’élément (widget) “Number of bins” est créé par la fonction selectInput(), et l’élément “Bandwidth adjustment” est créé par la fonction sliderInput().

Ces deux fonctions comportent des arguments qui permettent d’identifier, et de mettre en forme le widget. Le premier argument, qui étrangement n’est pas nommé, est inputId. Ainsi, l’inputId de selectInput() est “n_breaks”, et l’inputId de sliderInput() est “bw_adjust”. Cet argument est important, car il va être employé dans la fonction output renderPlot()`.

Pour plus d’informations sur les arguments des fonctions inputs, vous pouvez consulter l’aide :

library(shiny)
?selectInput
?sliderInput 

L’output est géré par la fonction renderPlot(). C’est dans cette fonction que l’histogramme est réalisé, grâce à la fonction hist().

La valeur sélectionnée du nombre de classes est récupéré par l’élément input$n_breaks. Et l’argument adjust de la courbe de densité est récupéré par l’élément input$bw_adjust)

Modifier le code du template

Maintenant que vous avez globalement compris le principe, il ne vous reste plus qu’à mettre les mains dans le cambouis et faire vos propres essais !

Les widgets de contrôle des inputs

Vous retrouverez une liste des widgets de contrôle des inputs disponibles (dans le package shiny de base), dans la cheatsheet shiny : 

liste des inputs de shiny

Pour accéder à la cheat sheet : Help –> Cheat Sheets –> Web Applications With Shiny.

 

Accéder à la cheat sheet de shiny

Vous trouverez également beaucoup d’informations sur cette page.

Les outputs

Les fonctions output sont également présentées dans la cheat sheet :

litse des outputs shiny

Vous trouverez également beaucoup d’informations sur cette page.

Deux exemples

Je vous propose ici deux petits exemples pour vous permettre de vous lancer plus facilement.

Exemple 1 : Choisir les modalités à afficher sur le graph

Voici un code pour réaliser un scatterplot en choisissant de faire apparaitre les données relatives à une ou plusieurs espèces :

library(ggplot2)
library(tidyverse)

inputPanel(
 checkboxGroupInput(
    inputId="Species", 
    label = "Espece(s) à afficher",
    choices = c("setosa", "versicolor", "virginica"), 
    selected = "setosa"))



renderPlot({
  selected_data <- iris %>% 
    dplyr::filter(Species %in% input$Species)   
  
ggplot(selected_data, aes(x=Sepal.Width, y=Sepal.Length, colour=Species))+
        geom_point()
}) 

Voici le rendu : 

Exemple d'application shiny dans r markdown

J’ai déployé le document sur le serveur shinyapps. Vous pouvez y accéder en cliquant sur bouton ci-dessous.

Exemple 2 : Choisir les variables à afficher dans une table

L’idée, ici, est d’obtenir une table descriptive des données iris en présentant la moyenne, l’écart-type, etc…) des variables numériques, en distinguant les espèces afin de pouvoir comparer les valeurs.

Le principe est de pivoter les données iris qui sont initialement dans un format wide, vers un format long, puis d’employer les fonctions group_by() et summarise() du package `dplyr`.

library(tidyr)
library(knitr)
iris_long <- iris %>%
    pivot_longer(cols=Sepal.Length:Petal.Width,
                 names_to="variable",
                 values_to="valeur")

table_descri <- iris_long %>% 
    group_by(variable, Species) %>% 
    summarise(moy=mean(valeur, na.rm=TRUE),
              sd=mean(valeur, na.rm=TRUE),
              mediane=median(valeur, na.rm=TRUE),
              min=min(valeur, na.rm=TRUE),
              max=max(valeur, na.rm=TRUE),
              n=length(valeur),
              nb_na=sum(is.na(valeur)))  

kable(table_descri) 
table descriptive

Si le nombre de variables pivotées est grand, la comparaison des valeurs entre les espèces peut être un peu difficile.

J’ai donc eu envie de créer une application shiny afin de pouvoir sélectionner les variables à afficher, et de pouvoir plus facilement comparer les valeurs entre les 3 espèces d’iris :

inputPanel(
 radioButtons(
    inputId="Variable", 
    label = "Variables à afficher",
    choices = names(iris[1:4]), 
    selected = names(iris[1])))



renderTable({
  selected_data <- table_descri %>% 
    dplyr::filter(variable %in% input$Variable) 
  
  selected_data
}) 

Voici le rendu : 

Vous pouvez accéder à l’application, pour voir ce que cela donne, en cliquant sur le bouton ci-dessous.

Remarque : Il est possible de faire la même chose sans application shiny en utilisant le package DT (merci Anna ! 😉).

Pour aller plus loin

Le prochain pas est de passer directement à shiny.

Pour cela il faudra gérer la partie interface et la partie server.  Voici deux très bonnes ressources pour vous lancer :

 

Vous souhaitez soutenir mon travail ? Vous pouvez le faire en réalisant un don libre sur la page Tipeee du blog.

5 réponses

  1. Bonjour Claire,
    Il est super bien ton article. Un réel support pour démarrer avec Shiny. Je le partage sans hésiter.

  2. Bonjour ! Merci énormément pour cette formation très méthodique.J’ai assimilé facilement l’usage de shiny.Je vais consulter les deux documents pour approfondir.Merci👍🏽

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.