diff --git a/Shiny/TP.Rmd b/Shiny/TP.Rmd index 6e0e18c60558c8393fb261bb9ab37f8171e445af..6fc7703bd1c15e1e541a397a746e38088da5bc39 100644 --- a/Shiny/TP.Rmd +++ b/Shiny/TP.Rmd @@ -20,9 +20,9 @@ output: # Shiny, c'est parti ! -* Créer une application shiny avec RStudio `File` > `New File` > `Shiny Web App` +* Créer une application shiny avec RStudio `File` > `New File` > `Shiny Web App`. -* Donner un nom à votre première appli et enregistrer la dans le dossier de votre choix avec le choix "Single File" +* Donner un nom à votre première application et enregistrer la dans le dossier de votre choix avec le choix "Single File". * Parcourir et exécuter le code : @@ -103,61 +103,61 @@ shinyApp(ui = ui, server = server) # Plusieurs onglets * Ajouter des onglets dans le `mainPanel()` avec l'aide de la fonction `tabsetPanel()` - * Le premier onglet : un histogramme - * Le second onglet : un boxplot - * Le troisième onglet : un tableau des données + * le premier onglet : un histogramme + * le second onglet : un boxplot + * le troisième onglet : un tableau des données > [app5.R](correction/app5.R) # Un peu d'aléatoire -* Actuellement notre plot affiche les données des durées entre deux éruptions du geyser *Old Faithful*. -* Remplacer les données par un tirage aléatoire de 10 valeurs `x <- rnorm(10)` -* Que se passe-t-il lorsque l'on change la couleur du plot ? Est ce que les différents onglets représentes les mêmes données ? Que proposez vous pour résoudre cela ? +* Actuellement, notre plot affiche les données des durées entre deux éruptions du geyser *Old Faithful*. +* Remplacer les données par un tirage aléatoire de 10 valeurs `x <- rnorm(10)`. +* Que se passe-t-il lorsque l'on change la couleur du plot ? Est-ce que les différents onglets représentent les mêmes données ? Que proposez-vous pour résoudre cela ? # De nouvelles données * Actuellement, les données sont directement gérées au sein de la fonction du plot. -* On va chercher a séparer le côté données, du côté figures. -* Supprimer la ligne correspondante (`x <- faithful[, 2]`) de la fonction et la remplacer par un appel à l'expression réactive `datasetInput()` (`x <- datasetInput()`) qui permettra de gérer les données de manière dynamique et réactive. Avant le `renderPlot` on définit l'expression reactive *datasetInput* tel que : +* On va chercher à séparer le côté "données", du côté "figures". +* Supprimer la ligne correspondante (`x <- faithful[, 2]`) de la fonction et la remplacer par un appel à l'expression réactive `datasetInput()` (`x <- datasetInput()`) qui permettra de gérer les données de manière dynamique et réactive. Avant le `renderPlot`, on définit l'expression réactive *datasetInput* tel que : ```R datasetInput <- reactive({faithful$waiting}) ``` -* Tester l'application, verifier que tout fonctionne toujours. Essayer de comprendre et d'assimiler l'articulation des différents éléments. +* Tester l'application et vérifier que tout fonctionne toujours. Essayer de comprendre et d'assimiler l'articulation des différents éléments. > [app6.R](correction/app6.R) -* Maintenant que tout est bon, avec une liste déroulante, proposer le choix entre la durée des éruptions du geyser *Old Faithful* (`faithful$waiting`), la longueur des sépales des iris de *Fisher* (`iris$Sepal.Length`) ou la puissance des voitures d'après *Motor Trend* (`mtcars$hp`) et mettre à jour `datasetInput()` en fonction de ce choix. - * **Note** : On peut utiliser un enchainement de `else if` ou bien la fonction `switch` +* Maintenant que tout est fonctionnel, à l'aide d'une liste déroulante, proposer le choix entre la durée des éruptions du geyser *Old Faithful* (`faithful$waiting`), la longueur des sépales des iris de *Fisher* (`iris$Sepal.Length`) ou la puissance des voitures d'après *Motor Trend* (`mtcars$hp`). Mettre mettre à jour `datasetInput()` en fonction de ce choix. + * **Note** : on peut utiliser un enchainement de `else if` ou bien la fonction `switch`. > [app7.R](correction/app7.R) # Des données générées aléatoirement * Ajouter un choix dans la liste correspondant à un tirage aléatoire de 100 valeurs distribuées normalement. - * Ajouter un champ dédié dans la liste déroulante - * Mettre à jour les données pour renvoyer `rnorm(100)` si *random* est sélectionné dans le champ *data*. -* **Note** : Le `reactive()` ne dépend pas des inputs du choix de couleur ou du nombre de *bins*. Le tirage aléatoire ne change donc pas lorsque la couleur ou les *bins* sont modifiés. + * ajouter un champ dédié dans la liste déroulante + * mettre à jour les données afin de renvoyer `rnorm(100)` si *random* est sélectionné dans le champ *data*. +* **Note** : le `reactive()` ne dépend pas des inputs du choix de couleur ou du nombre de *bins*. Le tirage aléatoire ne change donc pas lorsque la couleur ou les *bins* sont modifiés. > [app8.R](correction/app8.R) # Paramètres du tirage aléatoire * Dans la barre de paramètres, ajouter une section dédiée aux paramètres du tirage (`n`, `mean`, `sd`). -* **Bonus** : Afficher ces paramètres uniquement lorsque l'on sélectionne les données aléatoires dans la liste déroulante (voir `conditionalPanel`, attention à la syntaxe). +* **Bonus** : afficher ces paramètres uniquement lorsque l'on sélectionne les données aléatoires dans la liste déroulante (voir `conditionalPanel`, attention à la syntaxe). > [app9.R](correction/app9.R) -# Upload de données +# Téléchargement de données -* Permettre à l'utilisateur de charger ses données au format csv. - * Ajouter un champ dédié dans la liste déroulante - * Ajouter un widget d'upload - * **Aide R** : Utiliser la fonction `read.csv(file, header = FALSE)[,1]` pour extraire la première colonne. - * **Bonus** : Anticiper l'erreur du fichier non sélectionné avec les fonctions `validate()` et `need()` anisi que l'opérateur booléen OR `||` +* Permettre à l'utilisateur de charger ses données au format CSV. + * ajouter un champ dédié dans la liste déroulante + * ajouter un widget d'upload + * **Aide R** : utiliser la fonction `read.csv(file, header = FALSE)[,1]` pour extraire la première colonne. + * **Bonus** : anticiper l'erreur du fichier non sélectionné avec les fonctions `validate()` et `need()` anisi que l'opérateur booléen OR `||` > [app10.R](correction/app10.R) > [app10bonus.R](correction/app10bonus.R) @@ -165,9 +165,9 @@ datasetInput <- reactive({faithful$waiting}) # Des data.frames et `ggplot2` pour des graphiques élégants * `ggplot2` comme de nombreux autres packages R utilise les dataframes. On va donc exploiter nos données avec ce format. - * Pour les données de démo `faithful`, `iris` et `mtcars`, ce sont des dataframes - * Pour les données chargées par l'utilisateur, il s'agit d'un dataframe avant que l'on extrait la première colonne - * Pour les données générées aléatoirement on va construire sous le format data.frame + * pour les données de démo `faithful`, `iris` et `mtcars`, ce sont des dataframes + * pour les données chargées par l'utilisateur, il s'agit d'un dataframe avant que l'on extrait la première colonne + * pour les données générées aléatoirement on va construire sous le format data.frame * Remplacer le reactive `datasetInput` par : ```R @@ -181,9 +181,9 @@ datasetInput <- reactive({ }) ``` -* Ajouter un widget `varSelectInput` destiné à sélectionner une variable. - * Pour que ce widget se mette à jour en fonction des données choisies, il est nécessaire de le placer côté server. - * Pour l'afficher coté UI, on utilisera `uiOutput` qui renverra vers le `renderUI` associé où sera placé le widget. +* Ajouter un widget `varSelectInput` destiné à sélectionner une variable + * pour que ce widget se mette à jour en fonction des données choisies, il est nécessaire de le placer côté "server". + * pour l'afficher coté UI, on utilisera `uiOutput` qui renverra vers le `renderUI` associé où sera placé le widget. * Remplacer l'histogramme et le boxplot par l'équivalent en ggplot2. Le sujet du TP n'étant pas spécialement l'utilisation de `ggplot2`, voici directement les fonctions. Si vous êtes à l'aise, laissez libre cours à votre imagination pour les personnaliser. * Histogramme : `ggplot(data = datasetInput(), aes_string(x = input$variable)) + geom_histogram(bins = input$bins, fill = input$color, color = "white")` * Boxplot : `ggplot(data = datasetInput(), aes_string(y = input$variable)) + geom_boxplot(fill = input$color)` @@ -194,7 +194,7 @@ datasetInput <- reactive({ * Ajouter un bouton pour télécharger le plot grâce aux fonctions `downloadHandler` et `ggsave`. -**Note** : Pour que le téléchargement se lance correctement, lancer l'application dans un vrai browser. Utiliser la commande : +**Note** : pour que le téléchargement se lance correctement, lancer l'application dans un "vrai" navigateur. Utiliser la commande : ```r runApp('app11.R', launch.browser = TRUE) @@ -206,18 +206,18 @@ runApp('app11.R', launch.browser = TRUE) * On peut facilement mettre en forme l'interface utilisateur d'une application avec CSS (*cascading style sheets*). - * Choisir une feuille de style sur [Bootswatch](https://bootswatch.com/) - * Télécharger le fichier `bootstrap.css` dans le dossier `www/` de votre appli - * Indiquer le thème avec `theme = "bootstrap.css"` dans la fonction `fluidPage()` + * choisir une feuille de style sur [Bootswatch](https://bootswatch.com/) + * télécharger le fichier `bootstrap.css` dans le dossier `www/` de votre appli + * indiquer le thème avec `theme = "bootstrap.css"` dans la fonction `fluidPage()` > [app13.R](correction/app13.R) avec un fichier [bootstrap.css](correction/www/bootstrap.css) dans le dossier `www/` -# Déployement d'une appli avec shinyapps.io +# Déploiement d'une application avec shinyapps.io -* Créer un compte sur https://www.shinyapps.io/ -* Définir un nom de domaine. Vos applications apparaîtrons https://<domaine>.shinyapps.io/<appli>/ -* Rendez-vous sur la [page d'administration](https://www.shinyapps.io/admin/#/dashboard) et suivez les étapes pour connecter votre RStudio local à votre compte grâce à `rsconnect`. -* Cliquer sur l'icône Publish <img src="https://docs.rstudio.com/connect/user/images/publishIcon.png" alt="publish" width="25"/> -* Sélectionner les fichiers à publier, un nom et cliquer sur "Publish". -* **Note** : Votre appli doit s'appeler `app.R` ou bien `ui.r`+`server.R`. +* Créer un compte sur https://www.shinyapps.io/. +* Définir un nom de domaine. Vos applications apparaîtront via https://<domaine>.shinyapps.io/<appli>/. +* Rendez-vous sur la [page d'administration](https://www.shinyapps.io/admin/#/dashboard) et suivre les étapes afin de connecter votre RStudio local à votre compte grâce à `rsconnect`. +* Cliquer sur l'icône Publish <img src="https://docs.rstudio.com/connect/user/images/publishIcon.png" alt="publish" width="25"/>. +* Sélectionner les fichiers à publier, définir un nom et cliquer sur "Publish". +* **Note** : V-votre application doit s'appeler `app.R` ou bien `ui.r`+`server.R`. * C'est fini !