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.
Pour cela : File –> New File –> Rmarkdown –> Shiny.
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.
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 :
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
La première partie interactive permet de modifier l’apparence d’un graphique en changeant :
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:
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().
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)
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 !
Vous retrouverez une liste des widgets de contrôle des inputs disponibles (dans le package shiny de base), dans la cheatsheet shiny :
Pour accéder à la cheat sheet : Help –> Cheat Sheets –> Web Applications With Shiny.
Vous trouverez également beaucoup d’informations sur cette page.
Les fonctions output sont également présentées dans la cheat sheet :
Vous trouverez également beaucoup d’informations sur cette page.
Je vous propose ici deux petits exemples pour vous permettre de vous lancer plus facilement.
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 :
J’ai déployé le document sur le serveur shinyapps. Vous pouvez y accéder en cliquant sur bouton ci-dessous.
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)
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 ! 😉).
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.
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.
6 Responses
Bonjour Claire,
Il est super bien ton article. Un réel support pour démarrer avec Shiny. Je le partage sans hésiter.
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👍🏽
C’est vraiment un honneur de vous suivre Claire.
Bonjour Claire,
Merci infiniment pour cet article magique sur Shiny.
C’est réellement super 👍
Super !