R : Shiny - Déployer des applications web avec R
Chapitre 1 - Créer une première application web
Application Web
Une application interactive sur Internet est un type de programme accessible via un navigateur web, qui permet aux utilisateurs d’interagir avec le contenu et de recevoir des réponses en temps réel.
Voici ses caractéristiques et composants principaux :
Définition :
- Il s’agit d’une application accessible via Internet, généralement via un navigateur web.
- Elle offre une expérience interactive, où les actions de l’utilisateur déclenchent des réponses immédiates de l’application.
Caractéristiques clés :
- Interface utilisateur interactive : La partie visible de l’application avec laquelle l’utilisateur interagit directement. Elle peut inclure des éléments tels que des formulaires, des boutons, et des graphiques.
- Mise à jour du serveur en fonction des interactions : Lorsqu’un utilisateur effectue une action (par exemple, cliquer sur un bouton), cette action est traitée par le serveur, qui peut alors mettre à jour les données ou l’interface utilisateur en conséquence.
Représentation d’une application webComposants :
- Client (interface utilisateur) : La partie de l’application qui s’exécute dans le navigateur de l’utilisateur. Elle est responsable de présenter les informations à l’utilisateur et de recueillir ses entrées.
- Serveur (backend) : La partie de l’application qui s’exécute sur un serveur distant. Elle gère la logique de l’application, le traitement des données, et les interactions avec les bases de données ou d’autres services.
Exemples
Voici trois exemples d’applications web :
Package Shiny
La création d’applications web avec R ouvre des portes nouvelles,
spécialement pour les data scientists désireux de dépasser les
frontières du développement web classique. Ce processus permet de
développer à la fois l’interface utilisateur (ui
) et le
backend (server
) exclusivement en R, apportant une
souplesse remarquable.
Ces applications ne sont pas seulement réactives et adaptées aux requêtes, elles sont aussi hautement interactives. Les utilisateurs peuvent actualiser les paramètres en direct, enrichissant ainsi leur expérience. Cette autonomie dans l’exploration des résultats accentue l’engagement de l’utilisateur.
De plus, la créativité est au cœur de cette démarche. Elle permet de concevoir des applications visuellement attrayantes qui améliorent considérablement la présentation et l’analyse des données. L’atout majeur de cette approche réside dans sa capacité à fusionner performance technique et esthétisme, ouvrant ainsi des horizons novateurs dans le domaine de la data science.
Gestion d’une application Shiny
Une application Shiny typique a une structure spécifique avec différents répertoires et fichiers qui servent à différentes fins.
Par exemple, dans le cadre du développement de l’application
CrimeLA
, il est nécessaire de définir les composants
suivants :
Dossier Data
- Fonction : Le dossier ‘data’ est essentiel pour stocker les jeux de données utilisés par votre application.
- Contenu : Il peut contenir divers formats de fichiers, tels que CSV, RData, ou tout autre format que R peut lire et importer.
- Rôle : Ces données sont cruciales pour le fonctionnement de l’application, car elles constituent la base des analyses et des visualisations.
Dossier WWW
- Fonction : Le dossier ‘www’ est destiné aux fichiers statiques nécessaires pour l’interface de l’application.
- Contenu : Il peut inclure des feuilles de style CSS, des scripts JavaScript, et des images.
- Accès : Les éléments de ce dossier sont accessibles par le serveur Shiny et peuvent être intégrés dans l’application pour améliorer l’expérience utilisateur et l’interface visuelle.
app.R
- Description : Ce script représente généralement le cœur de l’application Shiny, contenant les scripts UI et Server.
global.R
- Fonction : Le script ‘global’ joue un rôle crucial dans le chargement des configurations.
- Utilisation : Il charge des fichiers contenant des paramètres qui influencent le comportement de l’application et sa connexion à d’autres services ou bases de données.
packages.R
- Fonction : Ce script est dédié à la gestion des packages.
- Rôle : Les packages sont des ensembles de fonctions supplémentaires qui peuvent être intégrés dans l’application pour étendre ses fonctionnalités ou pour faciliter certaines tâches de programmation.
Première application Shiny
Le package shiny
est essentiel, et vous pouvez avoir
besoin d’autres packages pour le traitement des données et la
visualisation.
Par défaut, il est possible d’éxécuter plusieurs applications
d’exemples. En utilisant runExample("nom_exemple")
, vous
pouvez exécuter une série d’exemples intégrés qui démontrent divers
aspects du développement d’applications Shiny.
Voici un aperçu de ce que chaque exemple montre :
01_hello: Une application de base montrant un histogramme. C’est une introduction simple à la structure d’une application Shiny.
02_text: Démontre comment afficher des tables et des data frames dans une application Shiny.
03_reactivity: Montre comment utiliser une expression réactive pour mettre à jour l’interface utilisateur en réponse aux entrées de l’utilisateur.
04_mpg: Explique l’utilisation de variables globales dans une application Shiny.
05_sliders: Montre comment utiliser les curseurs (sliders) pour entrer des données dans une application Shiny.
06_tabsets: Démontre l’utilisation de panneaux à onglets pour organiser le contenu.
07_widgets: Montre comment utiliser des widgets d’aide et des boutons de soumission.
08_html: Un exemple d’application Shiny construite à partir de HTML au lieu de R.
09_upload: Un assistant pour télécharger des fichiers dans l’application.
10_download: Un exemple montrant comment configurer le téléchargement de fichiers depuis l’application.
11_timer: (Non spécifié, mais probablement lié à l’utilisation de minuteries ou de fonctions basées sur le temps dans Shiny).
Pour lancer l’exemple "01_hello"
:
# Charger le package Shiny
library(shiny)
# Exécuter l'exemple intégré "01_hello"
runExample("01_hello")
Créer une app dans R Studio
Pour créer une application de base dans RStudio avec Shiny, suivez ces étapes :
Ouvrir RStudio : Assurez-vous d’avoir RStudio installé sur votre ordinateur.
Installer et charger le package Shiny : Si vous n’avez pas déjà installé le package Shiny, vous pouvez le faire en exécutant :
Après l’installation, chargez le package en exécutant :
Créer une nouvelle application Shiny :
- Allez dans le menu
File > New File > Shiny Web App...
- Donnez un nom à votre application.
- Choisissez l’emplacement où vous souhaitez enregistrer l’application.
- Sélectionnez le type d’application (par exemple, “Single File (app.R)”).
- Allez dans le menu
Rédiger le code de l’application :
- RStudio va générer un fichier
app.R
avec un exemple de code. - Modifiez ce code pour créer votre propre UI et logique serveur. Par exemple :
ui <- fluidPage( titlePanel("Mon Application Shiny"), sidebarLayout( sidebarPanel( sliderInput("slider", "Choisissez un nombre", 1, 100, 50) ), mainPanel( textOutput("result") ) ) ) server <- function(input, output) { output$result <- renderText({ paste("Vous avez choisi", input$slider) }) } shinyApp(ui = ui, server = server)
- RStudio va générer un fichier
Exécuter l’application :
- Cliquez sur le bouton
Run App
dans le coin supérieur droit de l’éditeur de script.
- Cliquez sur le bouton
Tester et ajuster :
- Votre navigateur web devrait s’ouvrir avec votre application Shiny en cours d’exécution.
- Testez l’application et apportez les modifications nécessaires dans RStudio.
Développer davantage :
- Ajoutez plus de fonctionnalités, des visualisations, ou connectez-vous à des bases de données selon les besoins de votre projet.
En suivant ces étapes, vous pouvez créer et tester votre propre application web interactive en utilisant R Shiny directement dans RStudio.
Minimum pour afficher une page
Pour afficher une page de base dans une application web avec R Shiny,
le code minimum requis se compose de trois parties principales : la
définition de l’interface utilisateur (ui
), la logique du
serveur (server
), et l’exécution de l’application
(shinyApp
).
Voici un exemple de code minimal :
# Charger le package Shiny
library(shiny)
# Définir l'interface utilisateur
ui <- fluidPage(
# Éléments de l'interface utilisateur peuvent être ajoutés ici
)
# Définir la logique du serveur
server <- function(input, output) {
# Logique de traitement des données et de réactivité
}
# Exécuter l'application
shinyApp(ui = ui, server = server)
Dans cet exemple :
fluidPage()
: Crée une page web responsive qui s’adapte à la taille de l’écran de l’utilisateur. Vous pouvez y ajouter divers composants, comme des textes, des graphiques, des tableaux, etc.server <- function(input, output) {}
: C’est ici que vous définirez la logique de votre serveur. Cette fonction traite les entrées de l’utilisateur (input
) et produit des sorties (output
).shinyApp(ui, server)
: Cette fonction lance l’application en combinant l’interface utilisateur et la logique serveur que vous avez définies.
Ce code est le squelette de base pour une application
Shiny. Pour créer une application fonctionnelle, vous ajouterez
des éléments à l’interface utilisateur (ui
) et définirez la
logique de traitement des données dans la fonction
server
.
Pour rendre le cours plus logique et structuré, je vais réorganiser le contenu en mettant en avant les éléments UI de base en R Shiny, suivis par une explication détaillée de chaque élément. Voici la version révisée :
Control Panels
Les “Control Panels” sont des éléments fondamentaux pour interagir avec l’utilisateur.
Ils se composent généralement de sidebarPanel()
, qui
permet d’ajouter une barre latérale à l’interface. Cette barre latérale
est idéale pour inclure divers widgets de contrôle, tels que des
curseurs, des sélecteurs d’options, des boutons et bien d’autres
éléments interactifs. Ces widgets facilitent la saisie de données et la
manipulation des visualisations ou des analyses affichées dans
l’application.
En outre, l’utilisation conjointe de fluidRow()
et
column()
permet de structurer de manière flexible
l’agencement de l’interface en lignes et colonnes, offrant ainsi une
mise en page réactive et organisée.
- sidebarPanel() :
- Utilisation : Ajout d’une barre latérale avec des widgets de contrôle (curseurs, sélecteurs, etc.).
- Exemple :
sidebarPanel("sidebar panel")
.
- fluidRow() et column() :
- Utilisation : Structuration du layout en lignes et colonnes pour un design responsive.
- Exemple : Inclus implicitement dans
fluidPage
.
Création d’une Interface Utilisateur de Base :
# Définition de l'interface utilisateur
ui <- fluidPage(
titlePanel("title panel"), # Titre
sidebarLayout( # Layout avec barre latérale
sidebarPanel("sidebar panel"),
mainPanel("main panel")
)
)
# Logique du serveur (vide dans cet exemple)
server <- function(input, output) {}
# Lancement de l'application
shinyApp(ui = ui, server = server)
Éléments UI Divers pour le Texte
Les éléments UI pour le texte offrent une variété d’options pour présenter et structurer le contenu.
Les en-têtes, de h1()
à h6()
, permettent de
créer des titres de différents niveaux, organisant le contenu de manière
hiérarchique. Le tag p()
est utilisé pour ajouter des
paragraphes standards, tandis que a()
crée des liens
hypertextes pour connecter à des URL externes.
Pour une séparation visuelle, br()
insère des sauts de
ligne. Les tags div()
et span()
sont
essentiels pour regrouper et styler du texte, respectivement pour des
blocs et des éléments en ligne. pre()
et
code()
sont spécialement utiles pour afficher du texte
préformaté et des lignes de code.
Enfin, pour mettre l’accent, strong()
et
em()
sont utilisés pour le texte en gras et en italique,
respectivement. Ces éléments contribuent à enrichir l’expérience
utilisateur en offrant une variété de méthodes pour afficher et
structurer le texte dans les applications Shiny.
- En-têtes (Headers) :
h1()
àh6()
: Créent des en-têtes de différents niveaux pour organiser le contenu hiérarchiquement.
- Paragraphe (Paragraph) :
p()
: Ajoute un paragraphe de texte standard.
- Lien hypertexte (Hyperlink) :
a(href = "https://www.example.com", "Texte")
: Crée un lien vers une URL externe.
- Saut de ligne (Line Break) :
br()
: Insère un saut de ligne.
- Division (Division) :
div()
: Regroupe et style du contenu.
- En ligne (Span) :
span()
: Pour le styling d’éléments inline.
- Texte préformaté (Preformatted Text) :
pre()
: Affiche du texte dans une police à largeur fixe.
- Code :
code()
: Pour afficher des lignes de code.
- Image :
img(src = "path_to_image.jpg", alt = "Description")
: Affiche une image.
- Texte en gras (Bold Text) :
strong()
: Met en évidence un texte en gras.
- Texte en italique (Italic Text) :
em()
: Met en évidence un texte en italique.
# Interface utilisateur avec divers éléments de texte
ui <- fluidPage(
h1("En-tête de niveau 1"),
h2("En-tête de niveau 2"),
p("Ceci est un paragraphe de texte dans Shiny."),
a(href = "https://www.example.com", "Ceci est un lien hypertexte"),
br(),
div("Ceci est une division de texte avec un style uniforme."),
span("Ceci est une division en ligne de texte avec un style uniforme."),
pre("Ceci est du texte ‘tel quel’ dans une police à largeur fixe."),
code("x <- 1:10"),
img(src = "path_to_image.jpg", alt = "Description de l'image"),
strong("Ceci est du texte en gras."),
em("Ceci est du texte en italique.")
)
server <- function(input, output) {}
shinyApp(ui = ui, server = server)
Exercices
Exercice 1
Reproduire une interface utilisateur identique à l’image de “My shiny App”.
Exercice 2
Définir un canva pour l’application sur les données CRIMES LA
Chapitre 2 - Interaction ui / server
Interface utilisateur
Dans le contexte du développement web, en particulier avec des frameworks comme Bootstrap utilisés fréquemment dans des applications R Shiny, la largeur d’une page est souvent décrite en termes de “grille”.
Dans Bootstrap, par exemple, la grille standard est divisée en 12 colonnes. Cette approche est adoptée pour faciliter la mise en page responsive, permettant aux éléments de s’adapter de manière flexible à différentes tailles d’écran.
Les applications Shiny, utilisées dans le langage de programmation R, sont conçues pour créer des interfaces utilisateur (UI) interactives, principalement axées sur l’analyse et la visualisation de données.
Layout
fluidPage()
: Crée une page responsivefluidRow()
: Organise le contenu en lignes horizontales.column(6, ...)
: Chaque appel àcolumn()
crée une colonne occupant la moitié de l’espace de la grille (6 sur 12 colonnes). Vous y placez les éléments UI tels que des en-têtes (h3
) et des paragraphes (p
).
library(shiny)
ui <- fluidPage(
titlePanel("Exemple de Fluid Page avec 2 Colonnes"),
# Utilisation de fluidRow pour organiser les colonnes
fluidRow(
# Première colonne
column(6,
h3("Colonne 1"),
p("Contenu de la première colonne")
),
# Deuxième colonne
column(6,
h3("Colonne 2"),
p("Contenu de la deuxième colonne")
)
)
)
server <- function(input, output) {}
# shinyApp(ui = ui, server = server)
Widgets d’entrée (Inputs)
Chaque widget d’entrée dans Shiny a une fonction correspondante dans le serveur Shiny pour traiter les entrées de l’utilisateur.
textInput()
: Permet à l’utilisateur de saisir du texte.numericInput()
: Pour la saisie de valeurs numériques.sliderInput()
: Un curseur pour sélectionner une gamme de valeurs.selectInput()
: Un menu déroulant pour choisir une option.checkboxInput()
etcheckboxGroupInput()
: Pour effectuer des sélections à l’aide de cases à cocher.radioButtons()
: Pour permettre à l’utilisateur de choisir une option parmi plusieurs.
library(shiny)
# UI definition
ui <- fluidPage(
# Layout
titlePanel("Exemple d'Application Shiny"),
sidebarLayout(
sidebarPanel(
# Input widgets
textInput("text_input", "Entrez du texte :"),
br(),
numericInput("num_input", "Entrez un nombre :", 1),
br(),
sliderInput("slider_input", "Choisissez une valeur :",
min = 1, max = 100, value = 50),
br(),
selectInput("select_input", "Choisissez une option :",
choices = c("Option 1", "Option 2", "Option 3")),
br(),
checkboxGroupInput("checkbox_input", "Sélectionnez :",
choices = c("Choix 1", "Choix 2", "Choix 3")),
br(),
radioButtons("radio_input", "Sélectionnez une option :",
choices = c("Option A", "Option B", "Option C"))
),
mainPanel(
)
)
)
# Server logic
server <- function(input, output) {
}
# Run the application
# shinyApp(ui = ui, server = server)
En résumé
La mise en page, quant à elle, est cruciale pour organiser visuellement les éléments UI et les rendre intuitifs et accessibles pour l’utilisateur.
Fonction | Widget |
---|---|
actionButton |
Bouton d’action |
checkboxGroupInput |
Groupe de cases à cocher |
checkboxInput |
Une case à cocher |
dateInput |
Calendrier pour la sélection de date |
dateRangeInput |
Paire de calendriers pour sélectionner une plage de dates |
fileInput |
Contrôle de téléchargement de fichier |
helpText |
Texte d’aide pouvant être ajouté à un formulaire |
numericInput |
Champ pour saisir des nombres |
radioButtons |
Ensemble de boutons radio |
selectInput |
Boîte avec choix à sélectionner |
sliderInput |
Barre de curseur |
submitButton |
Bouton de soumission |
textInput |
Champ pour saisir du texte |
Widgets de Sortie (outputs)
Grâce aux fonctions d’affichage, les données sont affichées sous différentes formes dans l’UI. Le tableau suivant couvre les types de sorties les plus couramment utilisés dans Shiny.
Fonction | Description |
---|---|
tableOutput() |
Affiche des données sous forme de table. |
plotOutput() |
Utilisé pour l’affichage de graphiques. |
textOutput() |
Pour afficher du texte simple. |
verbatimTextOutput() |
Pour afficher des résultats de code de manière littérale. |
imageOutput() |
Pour afficher des images. |
dataTableOutput() |
Pour afficher des données sous forme de table interactive (DataTable). |
uiOutput() |
Pour afficher des éléments UI générés dynamiquement. |
htmlOutput() |
Pour afficher du contenu HTML. |
downloadButton() ou downloadLink() |
Pour créer un bouton ou un lien de téléchargement. |
Chaque type de sortie est conçu pour afficher un type spécifique de contenu, allant des tables de données et des graphiques aux éléments HTML et aux liens de téléchargement.
Exemple 1
library(shiny)
# UI definition
ui <- fluidPage(
titlePanel("Exemple d'Application Shiny"),
sidebarLayout(
sidebarPanel(
br(),
textInput("text_input", "Entrez du texte :"),
br()
),
mainPanel(
h3("Résultats :"),
br(),
# la sortie affichée à l'utilisateur sera sous la forme d'un verbatim
verbatimTextOutput("text_renvoye_output")
)
)
)
# Server logic
server <- function(input, output) {
# Dans le server est définie une variable d'output "text_renvoye_output"
# Dans le corps de cette variable, l'input "text_input" est utilisé
# pour générer un texte concaténé
output$text_renvoye_output <- renderText({
paste("Texte entré :", input$text_input)
})
}
# Run the application
# shinyApp(ui = ui, server = server)
Exemple 2
library(shiny)
ui <- fluidPage(
titlePanel("Dynamic UI based on selectInput"),
sidebarLayout(
sidebarPanel(
# A gauche sont définies les options qui sont vues par l'utilisateur.
# Ces options sont utilisés côté server à partir des variables définies à droite
selectInput("select_input",
"Choisissez une option :",
choices = list("Option 1" = "value1",
"Option 2" = "value2",
"Option 3" = "value3"))
),
mainPanel(
uiOutput("dynamicOutput")
)
)
)
server <- function(input, output) {
# En fonction de l'option choisie (input$select_input),
# un message spécifique est renvoyé à l'aide d'un switch
output$dynamicOutput <- renderUI({
switch(input$select_input,
"value1" = p("Vous avez sélectionné l'Option 1."),
"value2" = p("Vous avez sélectionné l'Option 2."),
"value3" = p("Vous avez sélectionné l'Option 3."),
p("Sélectionnez une option."))
})
}
# Run the application
# shinyApp(ui = ui, server = server)
Server
Les fonctions “render”
Dans les applications Shiny, les fonctions
render
sont essentielles pour créer des
éléments de sortie réactifs.
Le tableau suivant offre une vue d’ensemble claire des différentes fonctions de rendu disponibles dans Shiny, vous permettant de choisir facilement la fonction appropriée en fonction de vos besoins en matière de visualisation et d’interface utilisateur.
Fonction | Crée | Utilisation |
---|---|---|
renderDataTable |
Un DataTable | Pour le rendu de tables interactives avancées. |
renderImage |
Des images | Pour afficher des images enregistrées sous forme de lien vers un fichier source. |
renderPlot |
Des graphiques | Pour le rendu de graphiques (comme ceux créés avec ggplot2 ou les fonctions de graphique de base de R). |
renderPrint |
Tout type de sortie imprimée | Pour afficher la sortie des instructions d’impression. |
renderTable |
Des data frames, matrices ou autres structures de table | Pour le rendu de tables simples. |
renderText |
Des chaînes de caractères | Pour afficher des sorties de texte simples. |
renderUI |
Un objet de balisage Shiny ou HTML | Pour le rendu dynamique d’éléments d’interface utilisateur en fonction de la logique côté serveur. |
En résumé
Chaque fonction render
prend une expression R entourée
d’accolades {}
comme argument. Cette
expression peut aller d’une simple ligne de code à un bloc de code plus
complexe.
Lien entre UI et server
Dans une application Shiny, le lien entre l’interface utilisateur (UI) et le serveur est crucial pour créer des applications interactives.
Exemple 1 : Dynamic UI
library(shiny)
ui <- fluidPage(
titlePanel("Checkbox Input Example"),
sidebarLayout(
sidebarPanel(
# Single checkbox
checkboxInput("check", "Check to see text", value = FALSE)
),
mainPanel(
uiOutput("dynamicText")
)
)
)
server <- function(input, output) {
output$dynamicText <- renderUI({
if(input$check) {
# Output quand checkbox est sélectionnée
p("The checkbox is checked!")
} else {
# Output quand checkbox n'est pas sélectionnée
p("The checkbox is not checked.")
}
})
}
# Run the application
# shinyApp(ui = ui, server = server)
Le lien entre uiOutput("dynamicText")
dans l’UI et
output$dynamicText
dans le serveur est un exemple parfait
de ce mécanisme. Voici comment cela fonctionne :
- UI Side -
uiOutput("dynamicText")
:- Dans l’UI,
uiOutput("dynamicText")
est utilisé pour créer un espace réservé dans lamainPanel
où le contenu dynamique sera affiché. - Le
"dynamicText"
est un identifiant unique qui permet de relier cet espace réservé à un élément spécifique généré côté serveur. uiOutput
est utilisé pour des éléments UI dont le contenu peut varier ou changer en réponse à des actions de l’utilisateur ou à d’autres événements.
- Dans l’UI,
- Server Side -
output$dynamicText
:- Dans le serveur,
output$dynamicText
correspond à l’identifiant défini dansuiOutput
. - La fonction
renderUI
est affectée àoutput$dynamicText
. Cette fonctionrenderUI
est réactive et sera réexécutée chaque fois que les entrées dont elle dépend (dans ce cas,input$check
) changeront. - Le contenu généré par
renderUI
est ensuite transmis à l’espace réservéuiOutput("dynamicText")
dans l’UI.
- Dans le serveur,
- Interaction et Réactivité :
- Lorsque l’utilisateur interagit avec l’application (par exemple, en
cochant ou décochant la case), cela change l’état de
input$check
. - En réponse à ce changement, le bloc de code à l’intérieur de
renderUI
associé àoutput$dynamicText
est réexécuté. - Le nouveau contenu généré (dans ce cas, un message indiquant si la
case est cochée ou non) est alors envoyé à l’UI et affiché dans la
mainPanel
oùuiOutput("dynamicText")
est placé.
- Lorsque l’utilisateur interagit avec l’application (par exemple, en
cochant ou décochant la case), cela change l’état de
En résumé,
uiOutput
dans l’UI crée un espace pour les éléments dynamiques, etoutput$...
dans le serveur définit ce qui doit être affiché dans cet espace. La fonctionrenderUI
sur le serveur permet de générer des éléments UI dynamiques en fonction des entrées de l’utilisateur, assurant ainsi une interaction réactive dans l’application Shiny.
Exemple 2 : Utilisation de plusieurs render
library(shiny)
library(DT)
ui <- fluidPage(
titlePanel("Exemple d'Application avec Divers Widgets de Sortie"),
sidebarLayout(
sidebarPanel(
# Widget d'entrée nécessaire pour 'input$selection'
textInput("selection", "Entrez votre sélection :")
),
mainPanel(
# Affichage des résultats des fonctions render*
dataTableOutput("dataTable"),
imageOutput("image"), # Correction ici
plotOutput("plot"),
verbatimTextOutput("print"),
tableOutput("table"),
textOutput("text"),
uiOutput("dynamicUI")
)
)
)
server <- function(input, output) {
# Pour renderDataTable
output$dataTable <- renderDataTable({
DT::datatable(mtcars)
})
# Pour renderImage
output$image <- renderImage({
list(src = 'C:/Users/Menyssa/Documents/Cours/R-Shiny/Images/data.png',
contentType = 'image/png', width = 400, height = 300)
}, deleteFile = FALSE)
# Pour renderPlot
output$plot <- renderPlot({
plot(cars)
})
# Pour renderPrint
output$print <- renderPrint({
summary(cars)
})
# Pour renderTable
output$table <- renderTable({
head(cars)
})
# Pour renderText
output$text <- renderText({
paste("Sélection actuelle :", input$selection)
})
# Pour renderUI
output$dynamicUI <- renderUI({
actionButton("button", "Cliquez-moi")
})
}
# shinyApp(ui = ui, server = server)
L’exemple précédent présente une sortie pour afficher différents types de contenus.
Interface Utilisateur (UI)
- TabsetPanel :
- Il s’agit d’un panneau à onglets (
tabsetPanel
) contenant plusieurstabPanel
, chacun destiné à afficher un type différent de sortie (dataTableOutput
,imageOutput
,plotOutput
, etc.).
- Il s’agit d’un panneau à onglets (
- Widgets de Sortie :
- Chaque
tabPanel
utilise une fonction de sortie spécifique (commedataTableOutput("dataTable")
,imageOutput("image")
, etc.), qui crée des espaces réservés dans l’UI pour les contenus générés dynamiquement par le serveur.
- Chaque
Serveur
- Fonctions
render
:- Chaque fonction
render*
correspond à un type de contenu différent et est reliée à un widget de sortie dans l’UI via un identifiant unique (output$dataTable
,output$image
, etc.). - Les fonctions
render*
traitent les données ou les instructions et produisent le contenu correspondant.
- Chaque fonction
- Exemples de Contenus Générés :
renderDataTable
génère une table interactive à partir de l’ensemble de donnéesmtcars
.renderImage
affiche une image stockée localement.renderPlot
crée un graphique à partir des donnéescars
.renderPrint
affiche un résumé (output textuel) de l’ensemble de donnéescars
.renderTable
montre les premières lignes des donnéescars
sous forme de tableau.renderText
crée un texte dynamique basé sur la saisie de l’utilisateur (input$selection
).renderUI
génère dynamiquement un élément UI, ici un bouton d’action (actionButton
).
Fonctionnement Global
- Lorsqu’un utilisateur interagit avec l’application (par exemple, en saisissant du texte ou en cliquant sur un onglet), les fonctions correspondantes dans le serveur sont déclenchées.
- Ces fonctions
render*
traitent les entrées et mettent à jour les contenus dans les espaces réservés correspondants de l’UI. - Cela crée une application interactive où les changements côté serveur sont immédiatement reflétés dans l’UI.
Expression réactive
Les applications Shiny sont appréciées pour leur capacité à interagir rapidement avec l’utilisateur. Cependant, lorsque des calculs lourds sont nécessaires, la performance peut en pâtir.
Heureusement, Shiny offre un moyen d’optimiser ces calculs grâce aux expressions réactives.
Définition
Une expression réactive dans Shiny est une expression R qui est automatiquement re-calculée lorsque les entrées dont elle dépend changent.
Cela signifie que si vous avez un calcul lourd qui dépend de l’entrée de l’utilisateur, il ne sera recalculé que si cette entrée change, réduisant ainsi le temps de chargement et améliorant l’expérience utilisateur.
Avantages
- Performance améliorée : Seuls les calculs nécessaires sont effectués.
- Code plus propre et plus facile à maintenir : Sépare la logique de calcul de la logique d’affichage.
- Prévention des calculs redondants : Évite de recalculer les mêmes données.
Utilisation
Pour utiliser une expression réactive, vous l’encapsulez dans la
fonction reactive()
.
Cette fonction retourne un objet réactif qui peut ensuite être utilisé dans d’autres parties de votre application Shiny.
Voici un exemple simple illustrant l’utilisation d’une expression réactive dans une application Shiny :
!! ATTENTION !! : Le resultat de données réactive s’utilise toujours avec des ().
Exemple 1 : deux expressions réactives
library(shiny)
library(DT)
ui <- fluidPage(
titlePanel("Utilisation des Expressions Réactives dans Shiny avec un Jeu de Données"),
sidebarLayout(
sidebarPanel(
sliderInput("number",
"Choisissez un nombre:",
min = 1,
max = 100,
value = 50),
selectInput("cylinders",
"Nombre de cylindres :",
choices = unique(mtcars$cyl),
selected = unique(mtcars$cyl)[1])
),
mainPanel(
textOutput("result"),
br(),
br(),
DTOutput("tableFiltered")
)
)
)
server <- function(input, output) {
# Expression réactive pour le calcul
reactiveNumber <- reactive({
input$number * 2
})
# Expression réactive pour filtrer les données
filteredData <- reactive({
mtcars[mtcars$cyl == input$cylinders, ]
})
output$result <- renderText({
paste("Le double du nombre est :", reactiveNumber())
})
output$tableFiltered <- renderDT({
filteredData()
})
}
# shinyApp(ui = ui, server = server)
Dans cet exemple :
- Un
selectInput
est ajouté pour permettre à l’utilisateur de sélectionner le nombre de cylindres. filteredData
est une nouvelle expression réactive qui filtremtcars
en fonction de la sélection de cylindres.output$tableFiltered
utiliserenderDT
pour afficher le tableau des données filtrées.
Exemple 2 : données mtcars
library(shiny)
library(DT)
library(tidyverse)
# Définition de l'interface utilisateur
ui <- fluidPage(
titlePanel("Exploration des données mtcars"),
sidebarLayout(
sidebarPanel(
helpText("Utilisez les contrôles ci-dessous pour filtrer les données."),
sliderInput("mpgInput", "Miles per gallon (mpg)",
min = min(mtcars$mpg, na.rm = TRUE),
max = max(mtcars$mpg, na.rm = TRUE),
value = c(min(mtcars$mpg, na.rm = TRUE),
max(mtcars$mpg, na.rm = TRUE))),
selectInput("cylInput", "Nombre de cylindres",
choices = unique(mtcars$cyl),
selected = unique(mtcars$cyl)[1],
multiple = TRUE),
selectInput("gearInput", "Nombre de vitesses",
choices = unique(mtcars$gear),
selected = unique(mtcars$gear)[1],
multiple = TRUE)
),
mainPanel(
DTOutput("table"),
plotOutput("mpgPlot")
)
)
)
# Définition de la logique serveur
server <- function(input, output) {
# Filtrer les données en fonction des entrées
filteredData <- reactive({
mtcars %>%
filter(mpg >= input$mpgInput[1], mpg <= input$mpgInput[2],
cyl %in% input$cylInput,
gear %in% input$gearInput)
})
# Affichage de la table
output$table <- renderDT({
filteredData()
})
# Graphique de mpg
output$mpgPlot <- renderPlot({
data <- filteredData()
ggplot(data, aes(x = mpg, fill = factor(cyl))) +
geom_histogram(binwidth = 1) +
theme_minimal() +
labs(title = "Distribution de MPG par Cylindre", x = "MPG",
fill = "Cylindres")
})
}
# Lancer l'application
# shinyApp(ui = ui, server = server)
Exercices
Exercice 4
Objectif : Développer une application simple pour les données
hdv2003
du package (questionr). Voici un squelette
d’application pour commencer.
Étape 1 : Installation et Chargement des Packages
Étape 2 : Création de l’Interface Utilisateur (UI)
ui <- fluidPage(
titlePanel("Analyse des Données hdv2003"),
sidebarLayout(
sidebarPanel(
# Widgets pour le filtrage des données
# (ajouter selectInput, sliderInput, etc. selon les besoins)
helpText("Utilisez les contrôles pour filtrer les données et visualiser les statistiques.")
),
mainPanel(
# Affichage des données filtrées
dataTableOutput("tableData"),
# Affichage des graphiques
plotOutput("plot"),
# Affichage des statistiques
verbatimTextOutput("stats")
)
)
)
Étape 3 : Logique du Serveur
server <- function(input, output) {
# Logique pour l'affichage des données
output$tableData <- renderDataTable({
# Appliquer le filtrage ici si nécessaire
DT::datatable(hdv2003)
})
# Logique pour la visualisation graphique
output$plot <- renderPlot({
# Générer le graphique en fonction des entrées utilisateur
# Par exemple, un histogramme de l'âge
})
# Logique pour le résumé statistique
output$stats <- renderPrint({
# Calculer et afficher les statistiques en fonction des entrées utilisateur
})
}
Conseils
Filtrage des Données : Utilisez les widgets d’entrée pour permettre aux utilisateurs de sélectionner des critères de filtrage. Appliquez ces critères dans
renderDataTable()
etrenderPlot()
pour mettre à jour les visualisations et les tables.Visualisation Graphique : Utilisez
ggplot2
pour créer des graphiques basés sur les données filtrées. Par exemple, créez un histogramme de l’âge ou un diagramme en barres des catégories socio-professionnelles.Résumé Statistique : Calculez des statistiques descriptives comme la moyenne, la médiane et l’écart-type pour les données filtrées et affichez-les avec
renderPrint()
.Interactivité Réactive : Assurez-vous que les modifications des widgets d’entrée déclenchent une mise à jour des tables, des graphiques et des statistiques.
Documentation et Aide : Ajoutez
helpText
ou des commentaires dans l’UI pour guider les utilisateurs sur la manière d’interagir avec l’application.
Chapitre 3 - Organisation et Cartographie
Organisation de l’app web
En suivant ces lignes directrices, votre application Shiny devrait être bien organisée, facile à maintenir et à étendre.
Script packages.R
Ce script est destiné à charger tous les packages nécessaires pour votre application. Cela aide à maintenir le code organisé et facilite le suivi des dépendances de l’application.
Ici :
- Un ensemble de packages qui sont couramment utilisés dans les
applications Shiny, notamment
shiny
pour les fonctionnalités de base,shinydashboard
pour une meilleure mise en page,DT
pour les tables interactives,tidyverse
pour la manipulation de données,leaflet
pour les cartes interactives, ethtmlwidgets
pour l’intégration d’autres widgets HTML/JavaScript
Script global.R
Ce script est utilisé pour définir les variables globales et charger
les données qui seront utilisées dans toute l’application. Les variables
définies dans global.R
sont disponibles dans les scripts
ui.R
, server.R
, et d’autres fichiers R que
vous pourriez inclure dans votre application.
Ici :
- Chargement des Données : le jeu de données sur les
crimes (
Crime_Data_from_2020_to_Present.csv
) qui est utilisé dans l’application. - Définition des Variables Globales :
titre_appli
: Utilisé pour stocker le titre de l’application.variables_data
: Contient les noms des colonnes du jeu de données, qui peuvent être utilisés pour la création de widgets d’entrée ou d’autres éléments d’interface.
Conseils d’Intégration : app.R
Appel de
global.R
etpackages.R
: Dans Shiny, ces fichiers sont généralement placés dans le même répertoire que vos scriptsui.R
etserver.R
. Ils sont chargés automatiquement avant ces scripts, donc toutes les variables et bibliothèques qu’ils contiennent seront disponibles globalement.Structuration de l’Application : Assurez-vous que le chemin vers votre fichier CSV est correct et accessible depuis l’endroit où l’application Shiny est exécutée.
Gestion des Packages : Vérifiez que tous les packages listés dans
packages.R
sont installés. Vous pouvez inclure des instructionsinstall.packages()
pour les packages manquants, mais commentez-les pour éviter de les réinstaller à chaque fois.
source(file = "../CrimeLA/global.r")
source(file = "../CrimeLA/packages.r")
ui <- fluidPage(
titlePanel(titre_appli),
sidebarLayout(
sidebarPanel(
selectInput("select_input",
"Choisissez une variable :",
choices = variables_data)
),
mainPanel(
tableOutput('variable')
)
)
)
server <- function(input, output){
output$variable <- renderTable({
tmp <- data %>%
select(input$select_input)
head(tmp)
})
}
# shinyApp(ui = ui, server = server)
Les Onglets
Les onglets sont principalement gérés à travers deux widgets :
tabPanel
et navlistPanel
. Cette section vous
fournira les connaissances et compétences nécessaires pour intégrer ces
éléments dans vos applications Shiny, améliorant ainsi la navigation et
la structure de votre contenu.
TabsetPanel
Le tabsetPanel
est un élément clé pour organiser le
contenu dans des onglets horizontaux. Cette méthode de présentation est
utile pour afficher différentes sections de contenu sans surcharger
l’interface utilisateur.
Voici un exemple de la structure de base d’un
tabsetPanel
:
ui <- fluidPage(
tabsetPanel(
tabPanel("Onglet 1",
# Contenu de l'onglet 1
),
tabPanel("Onglet 2",
# Contenu de l'onglet 2
)
# Ajouter plus d'onglets si nécessaire
)
)
Chaque tabPanel
dans le tabsetPanel
représente un onglet distinct, permettant aux utilisateurs de basculer
entre différents contenus.
Personnalisation
Comme pour les autres éléments de Shiny, il est possible d’ajouter
des icônes à vos tabPanel
au sein des
tabsetPanel
en utilisant la fonction icon()
.
Les icônes rendent l’interface plus intuitive et visuellement
attrayante.
Exemple Simple avec Onglets Horizontaux Un exemple
simple de tabsetPanel
peut être le suivant :
ui <- fluidPage(
tabsetPanel(
tabPanel("Accueil", icon = icon("home"),
# Contenu de l'accueil
),
tabPanel("Profil", icon = icon("user"),
# Contenu du profil
),
tabPanel("Paramètres", icon = icon("cog"),
# Contenu des paramètres
)
)
)
server <- function(input, output, session) {
# Logique du serveur
}
# shinyApp(ui, server)
Dans cet exemple, chaque onglet est clairement identifié par une icône, facilitant la navigation pour l’utilisateur.
Exemple 1 : Avec des widgets de sortie
Pour une utilisation plus avancée, vous pouvez intégrer du contenu
dynamique dans les tabsetPanel
:
ui <- fluidPage(
tabsetPanel(
tabPanel("Graphique",
plotOutput("monGraphique")
),
tabPanel("Tableau",
DT::dataTableOutput("monTableau")
),
tabPanel("Résumé",
verbatimTextOutput("monResume")
)
)
)
server <- function(input, output, session) {
output$monGraphique <- renderPlot({ plot(runif(50)) })
output$monTableau <- DT::renderDataTable({ DT::datatable(mtcars) })
output$monResume <- renderPrint({ summary(mtcars) })
}
# shinyApp(ui, server)
Dans ce scénario, chaque onglet affiche un type de sortie différent
(graphique, tableau, texte), démontrant la polyvalence des
tabsetPanel
pour la présentation de divers types de
données.
Personnalisation
Les icônes peuvent être ajoutées à chaque élément de la liste pour
améliorer l’esthétique et la compréhension de l’interface utilisateur.
Utilisez la fonction icon()
pour ajouter des icônes aux
titres de vos onglets.
Exemple 2 : Intégration de TabPanels
ui <- fluidPage(
navlistPanel(
"Navigation Complète",
tabPanel("Section 1",
# Contenu de la section 1
tabsetPanel(
tabPanel("Sous-section 1",
# Contenu de la sous-section 1
),
tabPanel("Sous-section 2",
# Contenu de la sous-section 2
)
)
),
tabPanel("Section 2",
# Contenu de la section 2
)
)
)
server <- function(input, output, session) {
# Logique du serveur
}
# shinyApp(ui, server)
Ici, chaque onglet principal dans le navlistPanel
contient son propre ensemble de sous-onglets, permettant une
organisation complexe et une navigation efficace.
Afficher des valeurs
valueBoxOutput
est une fonction
utilisée pour créer une sortie d’une “Value Box” dans l’interface
utilisateur (UI).
Les “Value Boxes” sont souvent utilisées dans les tableaux de
bord Shiny : dashboardPage
pour afficher des
résumés importants ou des statistiques clés de manière concise et
visuellement attrayante. Elles sont particulièrement utiles pour mettre
en évidence des chiffres ou des informations critiques, comme des
totaux, des moyennes, ou des pourcentages.
Cette fonction est généralement utilisée avec
renderValueBox
sur le côté serveur pour rendre le contenu
dynamique.
Voici quelques exemples pour illustrer son utilisation :
Exemple 1 : Affichage d’une valeur
library(shiny)
library(shinydashboard)
ui <- dashboardPage(
dashboardHeader(title = "Exemple de Value Box"),
dashboardSidebar(),
dashboardBody(
# Création de l'espace pour la Value Box
valueBoxOutput("myValueBox")
)
)
server <- function(input, output) {
output$myValueBox <- renderValueBox({
valueBox(
value = 123, # La valeur à afficher
subtitle = "Nombre total de quelque chose",
icon = icon("check"), # Icône (facultatif)
color = "green" # Couleur de la boîte (facultatif)
)
})
}
# shinyApp(ui, server)
Exemple 2 : Affichage d’une valeur calculée
library(shiny)
library(shinydashboard)
library(tidyverse)
ui <- dashboardPage(
dashboardHeader(title = "Exemple de Value Box"),
dashboardSidebar(),
dashboardBody(
# Création de l'espace pour la Value Box
valueBoxOutput("hommes")
)
)
server <- function(input, output) {
output$hommes <- renderValueBox({
hommes <- hdv2003 %>%
filter(sexe == 'Homme') %>%
nrow()
valueBox(format(hommes, big.mark = ","),
"Nombre d'hommes",
icon = icon("mars"))
})
}
# shinyApp(ui, server)
Exemple 3 : Style Personnalisé
library(shiny)
library(shinydashboard)
library(tidyverse)
ui <- dashboardPage(
dashboardHeader(title = "Exemple de Value Box"),
dashboardSidebar(),
dashboardBody(
# Création de l'espace pour la Value Box
valueBoxOutput("progressBox")
)
)
server <- function(input, output) {
# Fonction pour simuler la progression
simulateProgress <- function() {
Sys.sleep(1) # Simuler un certain délai
runif(1, min = 0, max = 100) # Retourne une valeur aléatoire entre 0 et 100
}
output$progressBox <- renderValueBox({
progress <- simulateProgress()
valueBox(
paste(format(round(progress, 0)), "%"),
"Progression",
icon = icon("line-chart"),
color = ifelse(progress < 50, "red", "green") # Rouge si < 50%, vert sinon
)
})
}
# shinyApp(ui, server)
Cartographie avec leaflet
site officiel : https://rstudio.github.io/leaflet/colors.html
Leaflet est une bibliothèque JavaScript open source
très populaire, utilisée pour créer des cartes interactives sur le Web.
Bien qu’elle soit principalement basée sur JavaScript, elle peut être
utilisée dans le langage de programmation R grâce à un package appelé
leaflet
pour R. Voici quelques points clés à connaître sur
Leaflet dans le contexte de R :
Création de cartes interactives: Leaflet vous permet de créer des cartes interactives que vous pouvez intégrer dans des applications web ou des documents R Markdown. Ces cartes peuvent être personnalisées avec différents styles et fonctionnalités.
Facilité d’utilisation: Même pour les débutants, Leaflet est relativement simple à utiliser en R. Vous pouvez commencer avec quelques lignes de code pour générer une carte de base, puis progressivement ajouter des fonctionnalités plus complexes.
Superpositions et marqueurs: Vous pouvez ajouter des superpositions à vos cartes, comme des marqueurs, des cercles ou des polygones, pour représenter des données géographiques. Ces éléments peuvent être interactifs, affichant des informations supplémentaires lorsque l’utilisateur clique dessus ou passe la souris dessus.
Intégration avec des données spatiales: Leaflet pour R fonctionne bien avec des données spatiales. Vous pouvez utiliser des packages comme
sf
(simple features) pour manipuler des données géographiques, puis les visualiser avec Leaflet.Personnalisation: Vous avez la possibilité de personnaliser l’apparence de votre carte avec différents styles de tuiles (par exemple, OpenStreetMap, Mapbox) et d’ajouter des fonctionnalités comme des couches de contrôle, des légendes, et plus encore.
Pour commencer avec Leaflet en R, vous devez d’abord installer et
charger le package leaflet
. Ensuite, vous pouvez utiliser
des fonctions comme leaflet()
pour créer une carte et
addTiles()
pour ajouter des tuiles de fond. De là, vous
pouvez explorer d’autres fonctions pour ajouter des marqueurs, des
couches, etc.
Installer et charger le package leaflet
{r} # if (!require(leaflet)) { # install.packages("leaflet") # } # library(leaflet)}
Cette partie vérifie d’abord si le package leaflet
est
installé (require(leaflet)
). Si ce n’est pas le cas
(!require(leaflet)
), il l’installe
(install.packages("leaflet")
). Ensuite, le package
leaflet
est chargé en mémoire avec
library(leaflet)
, ce qui permet d’utiliser ses
fonctions.
Voici un exemple de script pour génèrer une carte interactive sur laquelle vous pouvez zoomer et vous déplacer
Créer une carte de base
Ici, une carte de base est créée avec leaflet()
et des
tuiles par défaut (généralement d’OpenStreetMap) sont ajoutées avec
addTiles()
. Le résultat est stocké dans la variable
map
.
Ajouter un marqueur
library(leaflet)
map_point <- leaflet() %>%
addTiles() %>%
addMarkers(lng = -0.09, lat = 51.50, popup = "The marker is placed at London")
Cette ligne ajoute un marqueur sur la carte. Le marqueur est placé à Londres (longitude -0.09, latitude 51.50), et un texte popup s’affiche lorsque vous cliquez sur le marqueur (“The marker is placed at London”).
Changer le fond de carte
Dans la bibliothèque Leaflet pour R, les “providers” font référence aux différents fournisseurs de tuiles qui offrent divers styles de cartes.
Voici une liste de certains des fournisseurs de tuiles les plus
couramment utilisés disponibles via leaflet
:
- OpenStreetMap:
OpenStreetMap.Mapnik
OpenStreetMap.BlackAndWhite
OpenStreetMap.DE
OpenStreetMap.France
OpenStreetMap.HOT
- Stamen:
Stamen.Toner
Stamen.TonerLite
Stamen.Watercolor
Stamen.Terrain
Stamen.TerrainBackground
Stamen.TopOSMRelief
- Esri:
Esri.WorldStreetMap
Esri.DeLorme
Esri.WorldTopoMap
Esri.WorldImagery
Esri.WorldTerrain
Esri.WorldShadedRelief
Esri.WorldPhysical
Esri.OceanBasemap
Esri.NatGeoWorldMap
Esri.WorldGrayCanvas
- CartoDB:
CartoDB.Positron
CartoDB.PositronNoLabels
CartoDB.PositronOnlyLabels
CartoDB.DarkMatter
CartoDB.DarkMatterNoLabels
CartoDB.DarkMatterOnlyLabels
CartoDB.Voyager
CartoDB.VoyagerNoLabels
CartoDB.VoyagerOnlyLabels
CartoDB.VoyagerLabelsUnder
- Thunderforest:
Thunderforest.OpenCycleMap
Thunderforest.Transport
Thunderforest.TransportDark
Thunderforest.SpinalMap
Thunderforest.Landscape
Thunderforest.Outdoors
Thunderforest.Pioneer
Pour utiliser ces providers dans votre carte Leaflet, vous utilisez
généralement la syntaxe
addProviderTiles(providers$ProviderName)
, où
ProviderName
est remplacé par l’un des noms de fournisseurs
listés ci-dessus.
Il est important de noter que certains fournisseurs peuvent avoir des restrictions d’utilisation ou nécessiter des clés API, comme ceux de Mapbox. Assurez-vous de consulter la documentation ou le site Web du fournisseur pour des informations plus détaillées sur l’utilisation et les restrictions.
Ici, le style de la carte est changé en utilisant une tuile
différente fournie par CartoDB.Positron
, donnant à la carte
un aspect visuel différent.
Ajouter des marqueurs supplémentaires
data <- data.frame(
lng = c(-0.09, -0.11, -0.12),
lat = c(51.50, 51.52, 51.48),
label = c("Point 1", "Point 2", "Point 3")
)
map <- map %>%
addMarkers(data = data, ~lng, ~lat, popup = ~label)
Ces lignes ajoutent des marqueurs supplémentaires à la carte en
utilisant les données du data.frame
créé précédemment.
Chaque marqueur affiche le texte correspondant dans label
lorsqu’on clique dessus.
Autres exemples
Paris
IA School Toulouse
- Création du Contenu du Popup :
Cette portion crée une chaîne HTML content
qui sera
utilisée dans le popup. Elle contient un lien vers le site web de l’IA
School à Toulouse, ainsi que l’adresse de l’école, formatée avec des
balises HTML pour une meilleure présentation.
- Création et Configuration de la Carte avec Popup :
content <- paste(sep = "<br/>",
"<b><a href='https://www.intelligence-artificielle-school.com/ecole/nos-campus/toulouse/'>IA School - Toulouse</a></b>",
"2 Bd de Strasbourg",
"31000 Toulouse"
)
map_ia <- leaflet() %>%
addTiles() %>%
addPopups(1.4485130539619018, 43.60676750775245,
content, options = popupOptions(closeButton = FALSE)
) %>%
addProviderTiles(providers$Stamen.TonerLite)
Une nouvelle carte est créée, des tuiles de base sont ajoutées, et un
popup est placé aux coordonnées spécifiées (Toulouse, France). Le popup
affiche le contenu HTML défini précédemment. L’option
closeButton = FALSE
signifie que le popup n’aura pas de
bouton de fermeture.
Dans les deux cas, ces blocs de code illustrent comment créer des
cartes interactives en R avec le package leaflet
, en se
concentrant sur des emplacements spécifiques (Paris et Toulouse) et en
utilisant des fonctionnalités telles que les vues personnalisées, les
styles de tuiles et les popups.
Leaflet dans Rshiny
Le package Leaflet inclut des fonctionnalités puissantes et pratiques pour l’intégration avec les applications Shiny.
La plupart des widgets de sortie Shiny sont incorporés dans une
application en incluant une sortie (par exemple,
plotOutput
) pour le widget dans la définition de
l’interface utilisateur, et en utilisant une fonction de rendu (par
exemple, renderPlot
) dans la fonction serveur.
Les cartes Leaflet ne sont pas différentes ; dans l’interface
utilisateur, vous appelez leafletOutput
, et du côté
serveur, vous attribuez un appel à renderLeaflet
à la
sortie. À l’intérieur de l’expression renderLeaflet
, vous
retournez un objet de carte Leaflet.
library(shiny)
library(leaflet)
r_colors <- rgb(t(col2rgb(colors()) / 255))
names(r_colors) <- colors()
ui <- fluidPage(
leafletOutput("mymap"),
p(),
actionButton("recalc", "Nouveaux points")
)
server <- function(input, output, session) {
points <- eventReactive(input$recalc, {
cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
}, ignoreNULL = FALSE)
output$mymap <- renderLeaflet({
leaflet() %>%
addProviderTiles(providers$Stadia.StamenTonerLite,
options = providerTileOptions(noWrap = TRUE)
) %>%
addMarkers(data = points())
})
}
shinyApp(ui, server)
Dans cet exemple, une application Shiny est créée avec une carte Leaflet interactive. Les points sur la carte sont recalculés et mis à jour à chaque fois que l’utilisateur clique sur le bouton “Nouveaux points”.
Exercice
Exercice 5
Créer une application R Shiny complète pour cette analyse :
“Beer or Coffee in London - Tough Choice? No more!”
https://www.kaggle.com/code/gpreda/beer-or-coffee-in-london-tough-choice-no-more
Projet : Analyse des données CRIME LA
Créer un projet pour une application web Shiny basée sur un tableau de bord de données criminelles à Los Angeles.
Le projet sera organisé en plusieurs étapes, en intégrant les éléments de réactivité, une carte, des onglets, et des ValueBoxes.
Pour mener à bien votre projet de développement d’une application Shiny sur les données de criminalité à Los Angeles, voici un plan d’action détaillé répondant aux exigences énoncées :
1. Développement
Interface Utilisateur :
- Conception : Utilisez
shinydashboard
pour une interface claire et professionnelle. - Visualisation : Intégrez
ggplot2
pour les graphiques etleaflet
pour les cartes. - Filtrage des Données : Ajoutez des widgets comme
selectInput
,dateRangeInput
pour filtrer par type de crime, date, etc. - Statistiques Résumées : Utilisez
DT::datatable()
pour afficher les données etsummary()
pour les statistiques.
2. Données
Ne pas inclure le fichier de données dans le dépôt GitHub. Fournir des instructions sur comment charger le jeu de données dans le fichier README.
3. Dépôt GitHub
- Création du Dépôt : Créer un dépôt public sur GitHub.
- Fichier README : Inclure des instructions d’installation, un aperçu du projet, et des détails sur les fonctionnalités.
- Code Source : Déposer le code de l’application et les scripts nécessaires.
Exemple de Structure de Dépôt
/mon-application-shiny
/www
app.R
global.R
README.md
.gitignore
4. Documentation
- Documentation : Commentez le code pour expliquer les fonctions et les choix logiques.
- Commentaires : Ajoutez des commentaires aux sections clés pour faciliter la compréhension.
5. Soumission
- Lien GitHub : Assurez-vous que le lien est accessible et que le dépôt est public.
- Rapport : Inclure un rapport dans le dépôt GitHub ou en format PDF décrivant les choix de conception et les défis.
Critères d’Évaluation
Assurez-vous que votre application répond aux critères d’évaluation mentionnés, en mettant l’accent sur la fonctionnalité, l’utilisabilité, la qualité du code, l’analyse des données, et l’utilisation efficace de GitHub.
Conseils Supplémentaires
- Testez votre application en profondeur pour vous assurer qu’elle fonctionne sans erreur.
- Révisez votre application en fonction des retours des utilisateurs ou des collègues si possible.
- Mettez en Évidence les fonctionnalités uniques ou les analyses intéressantes dans votre rapport.
En suivant ce plan d’action, vous serez en mesure de créer une application Shiny bien conçue et documentée, tout en respectant les exigences éthiques et les meilleures pratiques de développement.
Bonne chance avec votre projet !
Projet : Visualisation des Velib à Paris
Ce projet vise à développer une application Shiny interactive qui étend le travail précédemment effectué par les étudiants de Bachelor sur la visualisation en temps réel des stations Vélib à Paris
Instructions
Vous êtes chargés d’intégrer, d’améliorer et d’optimiser ces visualisations dans une application R Shiny dynamique et conviviale.
Vous devez créer 3 onglets qui permettent aux utilisateurs de :
Visualiser en temps réel les informations (disponibilité des vélos, capacité des stations, etc.) sur les stations Vélib à Paris sous la forme d’une carte Leaflet
Afficher les stations par arrondissement et afficher les informations sous forme d’une table.
Créer une fonction qui permet d’entrer une adresse et de visualiser les stations velibs les plus proches (rayon de 500 mètres).
Code initial : Paris
library(tidyverse)
library(leaflet)
library(ggmap)
library(plotly)
library(leaflet)
url <- "https://opendata.paris.fr/api/explore/v2.1/catalog/datasets/velib-disponibilite-en-temps-reel/exports/csv?lang=fr&timezone=Europe%2FBerlin&use_labels=true&delimiter=%3B"
destfile <- tempfile(fileext = ".csv")
download.file(url, destfile)
velib_data <- read_delim(destfile, delim = ";", escape_double = FALSE, trim_ws = TRUE)
velib_sep <- separate(velib_data, "Coordonnées géographiques", into = c("latitude", "longitude"), sep = ",\\s*", convert = TRUE)
carte_velos <- leaflet(data = velib_sep) %>%
addTiles() %>%
setView(lng = 2.3522, lat = 48.8566, zoom = 12) %>%
addMarkers(
lng = ~longitude,
lat = ~latitude,
popup = ~paste(
"<b>Station Velib:</b>",
"<span style='font-size: 17px; text-decoration: underline;'>", `Nom station`, "</span>",
"<br><b>Nombre de vélos disponibles:</b>",
"<span style='font-size: 17px;'>", `Nombre total vélos disponibles`, "</span>",
"<br><b>Nombre de bornes libres:</b>",
"<span style='font-size: 17px;'>", `Nombre bornettes libres`, "</span>",
"<br><b>Vélos mécaniques disponibles:</b>",
"<span style='font-size: 17px;'>", `Vélos mécaniques disponibles`, "</span>",
"<br><b>Vélos électriques disponibles:</b>",
"<span style='font-size: 17px;'>", `Vélos électriques disponibles`, "</span>"
),
clusterOptions = markerClusterOptions())
carte_velos
Chapitre 4. Personnalisation de l’application
Shinythemes
La personnalisation d’une application Shiny avec
shinythemes
est un processus qui combine l’utilisation de
thèmes prédéfinis, la personnalisation CSS et une intégration soignée
avec les composants Shiny.
Cela peut améliorer considérablement l’apparence et l’expérience utilisateur de votre application Shiny.
Installation et chargement
Tout d’abord, vous devez installer et charger le package
shinythemes
.
Utilisation de thèmes prédéfinis
shinythemes
offre une variété de thèmes Bootstrap prédéfinis. Vous pouvez appliquer
ces thèmes à votre application Shiny en utilisant la fonction
theme
dans l’appel à fluidPage
ou
navbarPage
. Par exemple,
fluidPage(theme = shinytheme("flatly"), ...)
. Quelques
thèmes populaires incluent “flatly”, “darkly”, “cerulean”, entre
autres.
library(shiny)
library(shinythemes)
# Define UI for application that draws a histogram
ui <- fluidPage(
theme = shinytheme("united"),
# Application title
titlePanel("Old Faithful Geyser Data"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30)
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot")
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
output$distPlot <- renderPlot({
# generate bins based on input$bins from ui.R
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
# draw the histogram with the specified number of bins
hist(x, breaks = bins, col = 'darkgray', border = 'white',
xlab = 'Waiting time to next eruption (in mins)',
main = 'Histogram of waiting times')
})
}
# Run the application
# shinyApp(ui = ui, server = server)
ui <- fluidPage(
theme = shinytheme("yeti"), # Application du thème Yeti
navbarPage("Shiny avec Yeti",
tabPanel("Tab 1",
h2("Contenu du Tab 1")
),
tabPanel("Tab 2",
h2("Contenu du Tab 2")
)
)
)
server <- function(input, output, session) {}
# shinyApp(ui, server)
On peut laisser le choix à l’utilisateur de sélectionner le thème qu’il souhaite.
ui = fluidPage(
shinythemes::themeSelector(), # <--- Add this somewhere in the UI
sidebarPanel(
textInput("txt", "Text input:", "text here"),
sliderInput("slider", "Slider input:", 1, 100, 30),
actionButton("action", "Button"),
actionButton("action2", "Button2", class = "btn-primary")
),
mainPanel(
tabsetPanel(
tabPanel("Tab 1"),
tabPanel("Tab 2")
)
)
)
server = function(input, output) {}
# shinyApp(ui, server)
Personnalisation avec CSS
Ici, nous allons personnaliser l’apparence des boutons en plus
d’appliquer le thème sandstone
.
Dans l’UI
- Utiliser theme, tags et CSS :
library(shiny)
library(shinythemes)
ui <- fluidPage(
theme = shinytheme("sandstone"), # Application du thème Sandstone
tags$head(
tags$style(HTML("
.btn {
background-color: navy;
color: white;
}
.btn:hover {
background-color: skyblue;
}
"))
),
actionButton("myButton", "Cliquez Moi")
)
server <- function(input, output, session) {}
shinyApp(ui, server)
Utiliser
div
pour organiser l’UI avec des classes CSS :Ajouter du style CSS ou des scripts JavaScript :
Importer un fichier CSS
Supposons que vous ayez créé un fichier CSS nommé
custom.css
pour définir votre propre style. Vous pouvez
l’inclure dans votre application Shiny.
library(shiny)
library(shinythemes)
ui <- fluidPage(
theme = shinytheme("lumen"), # Application du thème Lumen
tags$head(
tags$link(rel = "stylesheet", type = "text/css", href = "custom.css") # Lien vers le fichier CSS personnalisé
),
headerPanel("Application avec CSS Personnalisé"),
sidebarLayout(
sidebarPanel(
sliderInput("slider", "Choisissez une valeur", 1, 100, 50)
),
mainPanel(
plotOutput("plot")
)
)
)
server <- function(input, output, session) {
output$plot <- renderPlot({
hist(rnorm(input$slider))
})
}
# shinyApp(ui, server)
Dans cet exemple, custom.css
devrait
être placé dans le même répertoire que votre script Shiny ou dans un
sous-dossier nommé www
.
Exemple : Création de box info personnalisée
library(shiny)
library(shinydashboard)
# Données exemple
info_ligne <- data.frame(
LIGNE = c("L1", "L2"),
annee_ouv = c(1900, 1905),
n_station = c(20, 25),
tps_parcours = c(30, 35),
longueur = c(10, 15),
dist_moy_arret = c(500, 600),
tps_marche_2_arret = c(5, 6),
auto = c("Oui", "Non"),
nb_rames = c(40, 50),
nb_commune_desservi = c(5, 6),
arrdsmt_pcpal = c("3e", "4e")
)
# Fonction pour les couleurs (exemple simple)
colligne <- function() {
"#FF5733"
}
# Fonction box_icon
box_icon <- function(...) {
tags$div(
class = "list-group",
lapply(list(...), function(x) {
tags$span(
class = "list-group-item",
tags$span(icon(x$icon, class = "fa-fw fa-lg"),
style = paste("color:", x$col)),
HTML(" "),
x$text
)
})
)
}
# UI
ui <- fluidPage(
fluidRow(
box(
title = "Informations Lignes : Le saviez-vous ?",
status = "primary",
width = 4,
uiOutput("info_ligne")
)
)
)
# Server
server <- function(input, output) {
output$info_ligne <- renderUI({
ligne_choisie <- "L1" # Exemple fixe pour le test
box_icon(
list(icon = "calendar", col = colligne(),
text = paste("Ouverture de la première ligne en", info_ligne$annee_ouv[info_ligne$LIGNE == ligne_choisie])
)
# ... autres éléments ...
)
})
}
# Lancement de l'application
# shinyApp(ui, server)
Exercice
Reproduire ce tableau issus de l’application suivante : ratp-traffic
Code pour le header :
.box.box-primary { border-top-color: #18bc9c !important; }
Projet : Shopper Sentiments reviews (3/ 4 personnes)
Objectif
Créer une application Shiny interactive pour analyser et visualiser les données des sentiments des clients issues de l’ensemble de données disponible sur Kaggle (Shopper Sentiments).
Données
Utilisez l’ensemble de données “Shopper Sentiments” qui contient diverses informations sur les avis des clients, comme les évaluations, les commentaires, et d’autres attributs pertinents.
Fonctionnalités Requises
- Importation et Nettoyage des Données :
- Permettre à l’utilisateur d’importer le jeu de données.
- Inclure des options pour nettoyer et prétraiter les données (gestion des valeurs manquantes, normalisation, etc.).
- Visualisation des Données :
- Créer des graphiques interactifs pour visualiser les données (par exemple, des histogrammes, des graphiques en barres, des boîtes à moustaches).
- Permettre à l’utilisateur de sélectionner des variables spécifiques pour la visualisation.
- Analyse des Sentiments :
- Analyser les sentiments des commentaires des clients (positifs, négatifs, neutres).
- Afficher les résultats sous forme de graphiques ou de tableaux récapitulatifs.
- Filtrage et Recherche :
- Permettre aux utilisateurs de filtrer les données en fonction de critères spécifiques (par exemple, plage de dates, évaluations, etc.).
- Inclure une fonction de recherche pour trouver des avis spécifiques.
- Thèmes et Personnalisation :
- Utiliser
shinythemes
pour permettre à l’utilisateur de changer le thème visuel de l’application. - Offrir des options de personnalisation de l’interface, comme le choix des couleurs ou la disposition des éléments.
- Utiliser
- Tableau de Bord et Navigation :
- Créer un tableau de bord intuitif avec une navigation facile entre différentes sections de l’application.
- Organiser l’application en onglets ou panneaux pour une meilleure clarté.
- Rapports et Exportation :
- Donner la possibilité de générer des rapports récapitulatifs basés sur les analyses effectuées.
- Permettre l’exportation des graphiques et des tableaux en différents formats (PDF, PNG, CSV).
Livrables
- Code source de l’application Shiny sur GitHub
- Présentation de 15 min
Évaluation
Les projets seront évalués sur les critères suivants : - Fonctionnalité : Respect des exigences et fonctionnalité globale. - Qualité du code : Propreté, organisation et documentation. - Créativité et innovation dans l’approche de visualisation et d’analyse des données.