From 54d5401d0e7a265043eb30a4b95623da73d033b7 Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:25:43 +0100 Subject: [PATCH 01/14] identify iris dataset --- shiny_tutorial.Rmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index fdb4ff8..7dca21e 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -24,6 +24,8 @@ library(learnr) ## Introduction +### Iris dataset + Pour le tutoriel, nous allons utiliser un jeu de données intégré à R, nommé Iris. Il recense les tailles de pétales et de sépales pour un ensemble d'individus "iris" de trois espèces différentes, setosa, versicolor et virginica. Exécuter le code suivant, bouton `Run code`, pour afficher les premières lignes du jeu de données: -- GitLab From af979ce4ecd6ecf6f6e6d24ed08b8a57dd30f436 Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:26:42 +0100 Subject: [PATCH 02/14] document how to create a shiny project from scratch in RStudio --- shiny_tutorial.Rmd | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index 7dca21e..e42a480 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -34,10 +34,28 @@ Exécuter le code suivant, bouton `Run code`, pour afficher les premières ligne head(iris) ``` +## Développer une application Shiny -## Base d'une application Shiny +### Créer une application Shiny -La base de notre application Shiny de départ est comprise dans deux fichiers obligatoires au fonctionnement d'une application Shiny, `ui.R` et `server.R`. +Créer un répertoire pour l’application avec **RStudio**. + +```bash +File -> New Project -> New Directory -> Shiny Web Application +``` + +Choisir une application **Multiple File**. + +Si cette option n’est pas disponible (ça peut dépendre des versions de Rstudio), on pourra utiliser + +```bash +File -> New File -> Shiny Web App -> Multiple File +``` + +Deux fichier sont automatiquement générés : `ui.R` et `server.R`. Lancer l’application en cliquant sur le bouton `Run App`. + + * Changer le titre de l’application. On pourra l’appeler My first application. + * Mettre à jour et vérifier que le titre a bien été changé. ### ui.R -- GitLab From 95deefd6586ba17ec8b44b3802b70ea76d03c3f0 Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:28:49 +0100 Subject: [PATCH 03/14] update doc and adapt code block to fit lines size --- shiny_tutorial.Rmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index e42a480..e95aeb4 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -59,9 +59,9 @@ Deux fichier sont automatiquement générés : `ui.R` et `server.R`. Lancer l’ ### ui.R -Voici un exemple de `ui.R` que nous allons utiliser. +Voici un exemple de `ui.R` que nous allons utiliser. Lancer le code avec le bouton `Run code` pour voir le rendu. -```{r ui_R, exercise=TRUE} +```{r ui_R, exercise=TRUE, exercise.lines=20, eval=FALSE} # k-means only works with numerical variables, # so don't give the user the option to select # a categorical variable -- GitLab From dff97f3113b14258ddbbaa7c59f73bd38526f2f0 Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:30:04 +0100 Subject: [PATCH 04/14] update selectedData exercice with hints and visual solution --- shiny_tutorial.Rmd | 102 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 88 insertions(+), 14 deletions(-) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index e95aeb4..b746faf 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -100,39 +100,113 @@ Il s'agit maintenant de remplir le fichier server.R pour obtenir des résultats Créer une reactive avec reactive({}) pour générer un tableau dynamique récupérant les 2 colonnes correspondant aux variables X et Y sélectionnées par l’utilisateur sur les données iris et ranger ce tableau dans une variable « selectedData » -```{r server_R_selected_data, exercise=TRUE} -function(input, output, session) { +```{r server_R_selected_data, exercise=TRUE, exercise.warn_invisible=TRUE} +# function(input, output, session) { +# ajouter votre code ci-dessous -} +# } +``` + +```{r server_R_selected_data-hint-1} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Combine the selected variables into a new data frame + selectedData <- reactive({...}) + +# } +``` + +```{r server_R_selected_data-hint-2} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Combine the selected variables into a new data frame + selectedData <- reactive({ + iris[, ... ] +}) + +# } +``` + +```{r server_R_selected_data-hint-3} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Combine the selected variables into a new data frame + selectedData <- reactive({ + iris[, c(input$xcol, input$ycol)] + }) + +# } ``` ```{r server_R_selected_data-solution} -function(input, output, session) { +# function(input, output, session) { +# ajouter votre code ci-dessous # Combine the selected variables into a new data frame selectedData <- reactive({ iris[, c(input$xcol, input$ycol)] }) -} + +# } ``` -### Générer le clustering k-means dasn une fonction reactive({}) +### Solution -Créer une reactive avec reactive({}) pour générer un cluster sur le tableau dynamique précédent, utilisant la variable « Cluster count » comme nombre de clusters à créer et ranger ce résultat dans une variable « clusters ». Utiliser la fonction kmeans() pour générer ces clusters. +Et voilà ce que contient `selectedData`: -```{r server_R_clusters, exercise=TRUE} -function(input, output, session) { +```{r server_R_selected_data-display, echo=FALSE} +vars <- setdiff(names(iris), "Species") -} +pageWithSidebar( + headerPanel('Iris: select data'), + sidebarPanel( + selectInput('xcol_sd', 'X Variable', vars), + selectInput('ycol_sd', 'Y Variable', vars, selected = vars[[2]]), + numericInput('clusters_sd', 'Cluster count', 3, min = 1, max = 9) + ), + mainPanel( + tabsetPanel(type = "tabs", + tabPanel("Selected data", DT::dataTableOutput("sd_selectedData")) + ) + ) +) ``` -```{r server_R_clusters-solution} -function(input, output, session) { - +```{r server_R_selected_data-print, echo=TRUE, context = "server"} +# function(input, output, session) { +# ajouter votre code ci-dessous + # Combine the selected variables into a new data frame selectedData <- reactive({ - iris[, c(input$xcol, input$ycol)] + iris[, c(input$xcol_sd, input$ycol_sd)] }) + + output$sd_selectedData <- DT::renderDataTable( + DT::datatable( + selectedData(), + options = list( + dom = 'Bfrtip', + lengthMenu = list(c(5, 15, -1), c('5', '15', 'All')), + pageLength = 15, + buttons = list( + list( + extend = "collection", + text = 'Show All', + action = DT::JS("function ( e, dt, node, config ) { + dt.page.len(-1); + dt.ajax.reload(); + }") + ) + ) + ) + ) + ) + +# } +``` clusters <- reactive({ kmeans(selectedData(), input$clusters) -- GitLab From e7dbd4c9abd17611660bca7a28329c4e727e60b9 Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:30:42 +0100 Subject: [PATCH 05/14] update render selectedData table exercice with hints and visual solution --- shiny_tutorial.Rmd | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index b746faf..1f5b1da 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -208,6 +208,103 @@ pageWithSidebar( # } ``` +### Générer un tableau des données sélectionnées pour le graphique + +Afficher le tableau dynamique avec renderTable{()} représentant le tableau utilisé pour générer le graphique et ranger le résultat dans output$table. Représenter cette table côté UI dans le tabPanel « Table ». + +```{r server_R_render_table, exercise=TRUE, context = "server", exercise.warn_invisible=TRUE} +# function(input, output, session) { +# ajouter votre code ci-dessous + +# } +``` + +```{r server_R_render_table-hint-1} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$table <- renderTable({...}) + +# } +``` + +```{r server_R_render_table-hint-2} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$table <- renderTable({ + selectedData() + }) + +# } +``` + +```{r server_R_render_table-solution} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$table <- renderTable({ + selectedData() + }) + +# } +``` + +### Solution + +Et voilà ce que contient `output$table`: + +```{r server_R_render_table-display, echo=FALSE} +vars <- setdiff(names(iris), "Species") + +pageWithSidebar( + headerPanel('Iris: print selected data table'), + sidebarPanel( + selectInput('xcol_tbl', 'X Variable', vars), + selectInput('ycol_tbl', 'Y Variable', vars, selected = vars[[2]]), + numericInput('clusters_tbl', 'Cluster count', 3, min = 1, max = 9) + ), + mainPanel( + tabsetPanel(type = "tabs", + tabPanel("Table", DT::dataTableOutput("tbl_selectedData")) + ) + ) +) +``` + +```{r server_R_render_table-print, context = "server"} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Combine the selected variables into a new data frame + tblselectedData <- reactive({ + iris[, c(input$xcol_tbl, input$ycol_tbl)] + }) + + output$tbl_selectedData <- DT::renderDataTable( + DT::datatable( + tblselectedData(), + options = list( + dom = 'Bfrtip', + lengthMenu = list(c(5, 15, -1), c('5', '15', 'All')), + pageLength = 15, + buttons = list( + list( + extend = "collection", + text = 'Show All', + action = DT::JS("function ( e, dt, node, config ) { + dt.page.len(-1); + dt.ajax.reload(); + }") + ) + ) + ) + ) + ) + +# } +``` + clusters <- reactive({ kmeans(selectedData(), input$clusters) }) -- GitLab From 2626748ff24c90fafc4361db911adb0f0486331b Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:31:22 +0100 Subject: [PATCH 06/14] update summary selectedData exercice with hints and visual solution --- shiny_tutorial.Rmd | 87 ++++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index 1f5b1da..2829d12 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -208,100 +208,103 @@ pageWithSidebar( # } ``` -### Générer un tableau des données sélectionnées pour le graphique -Afficher le tableau dynamique avec renderTable{()} représentant le tableau utilisé pour générer le graphique et ranger le résultat dans output$table. Représenter cette table côté UI dans le tabPanel « Table ». +### Générer un résumé statistique du tableau dynamique -```{r server_R_render_table, exercise=TRUE, context = "server", exercise.warn_invisible=TRUE} +Générer un texte dynamique avec renderPrint({}) représentant un résumé statistique du tableau dynamique généré précédemment avec la fonction summary() et ranger le résultat dans output$summary, puis le représenter côté UI dans le tabPanel « Summary ». + +```{r server_R_render_print, exercise=TRUE, context = "server", exercise.warn_invisible=TRUE} # function(input, output, session) { # ajouter votre code ci-dessous # } ``` -```{r server_R_render_table-hint-1} +```{r server_R_render_print-hint-1} # function(input, output, session) { # ajouter votre code ci-dessous - output$table <- renderTable({...}) + # Generate a summary of the data ---- + output$summary <- renderPrint({...}) # } ``` -```{r server_R_render_table-hint-2} +```{r server_R_render_print-hint-2} # function(input, output, session) { # ajouter votre code ci-dessous - output$table <- renderTable({ - selectedData() + # Generate a summary of the data ---- + output$summary <- renderPrint({ + summary(...) }) # } ``` -```{r server_R_render_table-solution} +```{r server_R_render_print-hint-3} # function(input, output, session) { # ajouter votre code ci-dessous - - output$table <- renderTable({ - selectedData() + + # Generate a summary of the data ---- + output$summary <- renderPrint({ + summary(selectedData()) }) # } ``` +```{r server_R_render_print-solution} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Generate a summary of the data ---- + output$summary <- renderPrint({ + summary(selectedData()) + }) + +# } +``` + ### Solution -Et voilà ce que contient `output$table`: +Et voilà ce que contient `output$summary`: -```{r server_R_render_table-display, echo=FALSE} +```{r server_R_render_print-display, echo=FALSE} vars <- setdiff(names(iris), "Species") pageWithSidebar( - headerPanel('Iris: print selected data table'), + headerPanel('Iris k-means clustering'), sidebarPanel( - selectInput('xcol_tbl', 'X Variable', vars), - selectInput('ycol_tbl', 'Y Variable', vars, selected = vars[[2]]), - numericInput('clusters_tbl', 'Cluster count', 3, min = 1, max = 9) + selectInput('xcol_smry', 'X Variable', vars), + selectInput('ycol_smry', 'Y Variable', vars, selected = vars[[2]]), + numericInput('clusters_smry', 'Cluster count', 3, min = 1, max = 9) ), mainPanel( tabsetPanel(type = "tabs", - tabPanel("Table", DT::dataTableOutput("tbl_selectedData")) + tabPanel("Summary", verbatimTextOutput("print_summary")) ) ) ) ``` -```{r server_R_render_table-print, context = "server"} +```{r server_R_render_print-print, context = "server"} # function(input, output, session) { # ajouter votre code ci-dessous # Combine the selected variables into a new data frame - tblselectedData <- reactive({ - iris[, c(input$xcol_tbl, input$ycol_tbl)] + smryselectedData <- reactive({ + iris[, c(input$xcol_smry, input$ycol_smry)] }) - output$tbl_selectedData <- DT::renderDataTable( - DT::datatable( - tblselectedData(), - options = list( - dom = 'Bfrtip', - lengthMenu = list(c(5, 15, -1), c('5', '15', 'All')), - pageLength = 15, - buttons = list( - list( - extend = "collection", - text = 'Show All', - action = DT::JS("function ( e, dt, node, config ) { - dt.page.len(-1); - dt.ajax.reload(); - }") - ) - ) - ) - ) - ) + smryclusters <- reactive({ + kmeans(smryselectedData(), input$clusters_smry) + }) + output$print_summary <- renderPrint({ + summary(smryselectedData()) + }) + # } ``` -- GitLab From 6c06942ee7dd1ab4a9c4a38feeb55b94869684a7 Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:32:06 +0100 Subject: [PATCH 07/14] update k-means clustering exercice with hints and visual solution --- shiny_tutorial.Rmd | 71 ++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 41 deletions(-) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index 2829d12..be32816 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -208,110 +208,99 @@ pageWithSidebar( # } ``` +### Générer le clustering k-means dans une fonction reactive({}) -### Générer un résumé statistique du tableau dynamique - -Générer un texte dynamique avec renderPrint({}) représentant un résumé statistique du tableau dynamique généré précédemment avec la fonction summary() et ranger le résultat dans output$summary, puis le représenter côté UI dans le tabPanel « Summary ». +Créer une reactive avec reactive({}) pour générer un cluster sur le tableau dynamique précédent, utilisant la variable « Cluster count » comme nombre de clusters à créer et ranger ce résultat dans une variable « clusters ». Utiliser la fonction kmeans() pour générer ces clusters. -```{r server_R_render_print, exercise=TRUE, context = "server", exercise.warn_invisible=TRUE} +```{r server_R_clusters, exercise=TRUE, exercise.warn_invisible=TRUE} # function(input, output, session) { # ajouter votre code ci-dessous # } ``` -```{r server_R_render_print-hint-1} +```{r server_R_clusters-hint-1} # function(input, output, session) { # ajouter votre code ci-dessous - # Generate a summary of the data ---- - output$summary <- renderPrint({...}) + clusters <- reactive({...}) # } ``` -```{r server_R_render_print-hint-2} +```{r server_R_clusters-hint-2} # function(input, output, session) { # ajouter votre code ci-dessous - # Generate a summary of the data ---- - output$summary <- renderPrint({ - summary(...) + clusters <- reactive({ + kmeans(...) }) # } ``` -```{r server_R_render_print-hint-3} +```{r server_R_clusters-hint-3} # function(input, output, session) { # ajouter votre code ci-dessous - - # Generate a summary of the data ---- - output$summary <- renderPrint({ - summary(selectedData()) + + clusters <- reactive({ + kmeans(selectedData(), input$clusters) }) # } ``` -```{r server_R_render_print-solution} +```{r server_R_clusters-solution} # function(input, output, session) { # ajouter votre code ci-dessous - # Generate a summary of the data ---- - output$summary <- renderPrint({ - summary(selectedData()) + clusters <- reactive({ + kmeans(selectedData(), input$clusters) }) - + # } ``` ### Solution -Et voilà ce que contient `output$summary`: +Et voilà ce que contient `clusters`: -```{r server_R_render_print-display, echo=FALSE} +```{r server_R_clusters-display, echo=FALSE} vars <- setdiff(names(iris), "Species") pageWithSidebar( - headerPanel('Iris k-means clustering'), + headerPanel('Iris print k-means clustering results'), sidebarPanel( - selectInput('xcol_smry', 'X Variable', vars), - selectInput('ycol_smry', 'Y Variable', vars, selected = vars[[2]]), - numericInput('clusters_smry', 'Cluster count', 3, min = 1, max = 9) + selectInput('xcol_km', 'X Variable', vars), + selectInput('ycol_km', 'Y Variable', vars, selected = vars[[2]]), + numericInput('clusters_km', 'Cluster count', 3, min = 1, max = 9) ), mainPanel( tabsetPanel(type = "tabs", - tabPanel("Summary", verbatimTextOutput("print_summary")) + tabPanel("K-means clusters", verbatimTextOutput("km_clusters")) ) ) ) ``` -```{r server_R_render_print-print, context = "server"} +```{r server_R_clusters-print, context = "server"} # function(input, output, session) { # ajouter votre code ci-dessous # Combine the selected variables into a new data frame - smryselectedData <- reactive({ - iris[, c(input$xcol_smry, input$ycol_smry)] + kmselectedData <- reactive({ + iris[, c(input$xcol_km, input$ycol_km)] }) - smryclusters <- reactive({ - kmeans(smryselectedData(), input$clusters_smry) + kmclusters <- reactive({ + kmeans(kmselectedData(), input$clusters_km) }) - output$print_summary <- renderPrint({ - summary(smryselectedData()) + output$km_clusters <- renderPrint({ + kmclusters() }) # } -``` - - clusters <- reactive({ - kmeans(selectedData(), input$clusters) - }) -} ``` ### Générer le plot dynamique du clustering kmeans -- GitLab From ab6e190e80643e5840fcf59d0f71288bbfc3426a Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:33:06 +0100 Subject: [PATCH 08/14] update plot k-means clustering exercise with hints and visual solution --- shiny_tutorial.Rmd | 211 +++++++++++++++++++-------------------------- 1 file changed, 91 insertions(+), 120 deletions(-) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index be32816..e2febfe 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -208,122 +208,104 @@ pageWithSidebar( # } ``` -### Générer le clustering k-means dans une fonction reactive({}) + clusters <- reactive({ + kmeans(selectedData(), input$clusters) + }) +} +``` + +### Générer le plot dynamique du clustering kmeans -Créer une reactive avec reactive({}) pour générer un cluster sur le tableau dynamique précédent, utilisant la variable « Cluster count » comme nombre de clusters à créer et ranger ce résultat dans une variable « clusters ». Utiliser la fonction kmeans() pour générer ces clusters. +Générer un graphique dynamique avec renderPlot{()} représentant le tableau dynamique avec la fonction plot() et colorer les points selon le cluster auquel ils appartiennent avec le paramètre « col ». Pour récupérer les clusters depuis la variable « clusters », utiliser clusters()\$cluster. Ranger le résultat dans output\$plot1 et le représenter côté UI dans le tabPanel « Plot ». -```{r server_R_clusters, exercise=TRUE, exercise.warn_invisible=TRUE} +```{r server_R_render_plot, exercise=TRUE, exercise.warn_invisible=TRUE} # function(input, output, session) { # ajouter votre code ci-dessous # } ``` -```{r server_R_clusters-hint-1} +```{r server_R_render_plot-hint-1} # function(input, output, session) { # ajouter votre code ci-dessous - clusters <- reactive({...}) + output$plot1 <- renderPlot({...}) # } ``` -```{r server_R_clusters-hint-2} +```{r server_R_render_plot-hint-2} # function(input, output, session) { # ajouter votre code ci-dessous - clusters <- reactive({ - kmeans(...) + output$plot1 <- renderPlot({ + # create a 9 colors palette + palette(...) + }) # } ``` -```{r server_R_clusters-hint-3} +```{r server_R_render_plot-hint-3} # function(input, output, session) { # ajouter votre code ci-dessous - - clusters <- reactive({ - kmeans(selectedData(), input$clusters) + + output$plot1 <- renderPlot({ + # create a 9 colors palette + palette(...) + + # define margins: replace *_margin placeholders by real values + par(mar = c(bottom_margin, left_margin, top_margin, right_margin)) }) # } ``` -```{r server_R_clusters-solution} +```{r server_R_render_plot-hint-4} # function(input, output, session) { # ajouter votre code ci-dessous - - clusters <- reactive({ - kmeans(selectedData(), input$clusters) + + output$plot1 <- renderPlot({ + # create a 9 colors palette + palette(...) + + # define margins: replace *_margin placeholders by real values + par(mar = c(bottom_margin, left_margin, top_margin, right_margin)) + + # create the plot + plot(selectedData(), + ...) + }) # } ``` -### Solution - -Et voilà ce que contient `clusters`: - -```{r server_R_clusters-display, echo=FALSE} -vars <- setdiff(names(iris), "Species") - -pageWithSidebar( - headerPanel('Iris print k-means clustering results'), - sidebarPanel( - selectInput('xcol_km', 'X Variable', vars), - selectInput('ycol_km', 'Y Variable', vars, selected = vars[[2]]), - numericInput('clusters_km', 'Cluster count', 3, min = 1, max = 9) - ), - mainPanel( - tabsetPanel(type = "tabs", - tabPanel("K-means clusters", verbatimTextOutput("km_clusters")) - ) - ) -) -``` - -```{r server_R_clusters-print, context = "server"} +```{r server_R_render_plot-hint-5} # function(input, output, session) { # ajouter votre code ci-dessous - # Combine the selected variables into a new data frame - kmselectedData <- reactive({ - iris[, c(input$xcol_km, input$ycol_km)] - }) - - kmclusters <- reactive({ - kmeans(kmselectedData(), input$clusters_km) + output$plot1 <- renderPlot({ + # create a 9 colors palette + palette(...) + + # define margins: replace *_margin placeholders by real values + par(mar = c(bottom_margin, left_margin, top_margin, right_margin)) + + # create the plot: set the points color, shape, etc. + plot(selectedData(), + ...) + # add the cluster centers: set the points color, shape, etc. + points(clusters()$centers, ...) }) - output$km_clusters <- renderPrint({ - kmclusters() - }) - # } ``` -### Générer le plot dynamique du clustering kmeans - -Générer un graphique dynamique avec renderPlot{()} représentant le tableau dynamique avec la fonction plot() et colorer les points selon le cluster auquel ils appartiennent avec le paramètre « col ». Pour récupérer les clusters depuis la variable « clusters », utiliser clusters()\$cluster. Ranger le résultat dans output\$plot1 et le représenter côté UI dans le tabPanel « Plot ». - -```{r server_R_render_plot, exercise=TRUE} -function(input, output, session) { - -} -``` - -```{r server_R_render_plot-solution} -function(input, output, session) { - - # Combine the selected variables into a new data frame - selectedData <- reactive({ - iris[, c(input$xcol, input$ycol)] - }) - - clusters <- reactive({ - kmeans(selectedData(), input$clusters) - }) +```{r server_R_render_plot-hint-6} +# function(input, output, session) { +# full solution output$plot1 <- renderPlot({ palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", @@ -335,30 +317,13 @@ function(input, output, session) { pch = 20, cex = 3) points(clusters()$centers, pch = 4, cex = 4, lwd = 4) }) -} -``` - -### Générer un résumé statistique du tableau dynamique -Générer un texte dynamique avec renderPrint({}) représentant un résumé statistique du tableau dynamique généré précédemment avec la fonction summary() et ranger le résultat dans output$summary, puis le représenter côté UI dans le tabPanel « Summary ». - -```{r server_R_render_print, exercise=TRUE} -function(input, output, session) { - -} +# } ``` -```{r server_R_render_print-solution} -function(input, output, session) { - - # Combine the selected variables into a new data frame - selectedData <- reactive({ - iris[, c(input$xcol, input$ycol)] - }) - - clusters <- reactive({ - kmeans(selectedData(), input$clusters) - }) +```{r server_R_render_plot-solution, context="server"} +# function(input, output, session) { +# ajouter votre code ci-dessous output$plot1 <- renderPlot({ palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", @@ -371,55 +336,61 @@ function(input, output, session) { points(clusters()$centers, pch = 4, cex = 4, lwd = 4) }) - # Generate a summary of the data ---- - output$summary <- renderPrint({ - summary(selectedData()) - }) -} +# } ``` -### Générer un tableau des données sélectionnées pour le graphique +### Solution -Afficher le tableau dynamique avec renderTable{()} représentant le tableau utilisé pour générer le graphique et ranger le résultat dans output$table. Représenter cette table côté UI dans le tabPanel « Table ». +Et voilà ce que contient `output$plot1`: -```{r server_R_render_table, exercise=TRUE} -function(input, output, session) { +```{r server_R_render_plot-display, echo=FALSE} +vars <- setdiff(names(iris), "Species") -} +pageWithSidebar( + headerPanel('Iris plot k-means clustering results'), + sidebarPanel( + selectInput('xcol_plot', 'X Variable', vars), + selectInput('ycol_plot', 'Y Variable', vars, selected = vars[[2]]), + numericInput('clusters_plot', 'Cluster count', 3, min = 1, max = 9) + ), + mainPanel( + tabsetPanel(type = "tabs", + tabPanel("K-means clusters plot", plotOutput("km_plot")), + tabPanel("K-means clusters", verbatimTextOutput("print_clusters")) + ) + ) +) ``` -```{r server_R_render_table-solution} -function(input, output, session) { +```{r server_R_render_plot-print, context = "server"} +# function(input, output, session) { +# ajouter votre code ci-dessous # Combine the selected variables into a new data frame - selectedData <- reactive({ - iris[, c(input$xcol, input$ycol)] + plotselectedData <- reactive({ + iris[, c(input$xcol_plot, input$ycol_plot)] }) - clusters <- reactive({ - kmeans(selectedData(), input$clusters) + plotclusters <- reactive({ + kmeans(plotselectedData(), input$clusters_plot) }) - output$plot1 <- renderPlot({ + output$print_clusters <- renderPrint({ + plotclusters() + }) + + output$km_plot <- renderPlot({ palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999")) par(mar = c(5.1, 4.1, 0, 1)) plot(selectedData(), - col = clusters()$cluster, + col = plotclusters()$cluster, pch = 20, cex = 3) - points(clusters()$centers, pch = 4, cex = 4, lwd = 4) + points(plotclusters()$centers, pch = 4, cex = 4, lwd = 4) }) - # Generate a summary of the data ---- - output$summary <- renderPrint({ - summary(selectedData()) - }) - - output$table <- renderTable({ - selectedData() - }) -} +# } ``` ## Application Shiny complète -- GitLab From edb69e441d2d34ef6afcf269ce7a031660eb0e95 Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:33:57 +0100 Subject: [PATCH 09/14] update ui in shiny demo live --- shiny_tutorial.Rmd | 186 +++++++++++++++------------------------------ 1 file changed, 63 insertions(+), 123 deletions(-) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index e2febfe..3616fa5 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -218,94 +218,23 @@ pageWithSidebar( Générer un graphique dynamique avec renderPlot{()} représentant le tableau dynamique avec la fonction plot() et colorer les points selon le cluster auquel ils appartiennent avec le paramètre « col ». Pour récupérer les clusters depuis la variable « clusters », utiliser clusters()\$cluster. Ranger le résultat dans output\$plot1 et le représenter côté UI dans le tabPanel « Plot ». -```{r server_R_render_plot, exercise=TRUE, exercise.warn_invisible=TRUE} -# function(input, output, session) { -# ajouter votre code ci-dessous - -# } -``` - -```{r server_R_render_plot-hint-1} -# function(input, output, session) { -# ajouter votre code ci-dessous - - output$plot1 <- renderPlot({...}) - -# } -``` - -```{r server_R_render_plot-hint-2} -# function(input, output, session) { -# ajouter votre code ci-dessous - - output$plot1 <- renderPlot({ - # create a 9 colors palette - palette(...) - - }) - -# } -``` - -```{r server_R_render_plot-hint-3} -# function(input, output, session) { -# ajouter votre code ci-dessous - - output$plot1 <- renderPlot({ - # create a 9 colors palette - palette(...) - - # define margins: replace *_margin placeholders by real values - par(mar = c(bottom_margin, left_margin, top_margin, right_margin)) - }) +```{r server_R_render_plot, exercise=TRUE} +function(input, output, session) { -# } +} ``` -```{r server_R_render_plot-hint-4} -# function(input, output, session) { -# ajouter votre code ci-dessous - - output$plot1 <- renderPlot({ - # create a 9 colors palette - palette(...) - - # define margins: replace *_margin placeholders by real values - par(mar = c(bottom_margin, left_margin, top_margin, right_margin)) - - # create the plot - plot(selectedData(), - ...) - +```{r server_R_render_plot-solution} +function(input, output, session) { + + # Combine the selected variables into a new data frame + selectedData <- reactive({ + iris[, c(input$xcol, input$ycol)] }) - -# } -``` - -```{r server_R_render_plot-hint-5} -# function(input, output, session) { -# ajouter votre code ci-dessous - - output$plot1 <- renderPlot({ - # create a 9 colors palette - palette(...) - - # define margins: replace *_margin placeholders by real values - par(mar = c(bottom_margin, left_margin, top_margin, right_margin)) - - # create the plot: set the points color, shape, etc. - plot(selectedData(), - ...) - # add the cluster centers: set the points color, shape, etc. - points(clusters()$centers, ...) + + clusters <- reactive({ + kmeans(selectedData(), input$clusters) }) - -# } -``` - -```{r server_R_render_plot-hint-6} -# function(input, output, session) { -# full solution output$plot1 <- renderPlot({ palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", @@ -317,13 +246,30 @@ Générer un graphique dynamique avec renderPlot{()} représentant le tableau dy pch = 20, cex = 3) points(clusters()$centers, pch = 4, cex = 4, lwd = 4) }) +} +``` -# } +### Générer un résumé statistique du tableau dynamique + +Générer un texte dynamique avec renderPrint({}) représentant un résumé statistique du tableau dynamique généré précédemment avec la fonction summary() et ranger le résultat dans output$summary, puis le représenter côté UI dans le tabPanel « Summary ». + +```{r server_R_render_print, exercise=TRUE} +function(input, output, session) { + +} ``` -```{r server_R_render_plot-solution, context="server"} -# function(input, output, session) { -# ajouter votre code ci-dessous +```{r server_R_render_print-solution} +function(input, output, session) { + + # Combine the selected variables into a new data frame + selectedData <- reactive({ + iris[, c(input$xcol, input$ycol)] + }) + + clusters <- reactive({ + kmeans(selectedData(), input$clusters) + }) output$plot1 <- renderPlot({ palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", @@ -336,61 +282,55 @@ Générer un graphique dynamique avec renderPlot{()} représentant le tableau dy points(clusters()$centers, pch = 4, cex = 4, lwd = 4) }) -# } + # Generate a summary of the data ---- + output$summary <- renderPrint({ + summary(selectedData()) + }) +} ``` -### Solution +### Générer un tableau des données sélectionnées pour le graphique -Et voilà ce que contient `output$plot1`: +Afficher le tableau dynamique avec renderTable{()} représentant le tableau utilisé pour générer le graphique et ranger le résultat dans output$table. Représenter cette table côté UI dans le tabPanel « Table ». -```{r server_R_render_plot-display, echo=FALSE} -vars <- setdiff(names(iris), "Species") +```{r server_R_render_table, exercise=TRUE} +function(input, output, session) { -pageWithSidebar( - headerPanel('Iris plot k-means clustering results'), - sidebarPanel( - selectInput('xcol_plot', 'X Variable', vars), - selectInput('ycol_plot', 'Y Variable', vars, selected = vars[[2]]), - numericInput('clusters_plot', 'Cluster count', 3, min = 1, max = 9) - ), - mainPanel( - tabsetPanel(type = "tabs", - tabPanel("K-means clusters plot", plotOutput("km_plot")), - tabPanel("K-means clusters", verbatimTextOutput("print_clusters")) - ) - ) -) +} ``` -```{r server_R_render_plot-print, context = "server"} -# function(input, output, session) { -# ajouter votre code ci-dessous +```{r server_R_render_table-solution} +function(input, output, session) { # Combine the selected variables into a new data frame - plotselectedData <- reactive({ - iris[, c(input$xcol_plot, input$ycol_plot)] - }) - - plotclusters <- reactive({ - kmeans(plotselectedData(), input$clusters_plot) + selectedData <- reactive({ + iris[, c(input$xcol, input$ycol)] }) - output$print_clusters <- renderPrint({ - plotclusters() + clusters <- reactive({ + kmeans(selectedData(), input$clusters) }) - output$km_plot <- renderPlot({ + output$plot1 <- renderPlot({ palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999")) par(mar = c(5.1, 4.1, 0, 1)) plot(selectedData(), - col = plotclusters()$cluster, + col = clusters()$cluster, pch = 20, cex = 3) - points(plotclusters()$centers, pch = 4, cex = 4, lwd = 4) + points(clusters()$centers, pch = 4, cex = 4, lwd = 4) }) -# } + # Generate a summary of the data ---- + output$summary <- renderPrint({ + summary(selectedData()) + }) + + output$table <- renderTable({ + selectedData() + }) +} ``` ## Application Shiny complète @@ -405,7 +345,7 @@ shiny::runApp(".") ### L'application shiny en démo live -Si vous avez exécuter la commande ``shiny::runApp(".")`` dans la console, vous pouvez voir l'application en démo live ci-dessous. +Si vous avez exécuter la commande `shiny::runApp(".")` dans la console, vous pouvez voir l'application en démo live ci-dessous. ```{r shiny_run_app_demo, echo=FALSE} # k-means only works with numerical variables, @@ -422,7 +362,7 @@ pageWithSidebar( ), mainPanel( tabsetPanel(type = "tabs", - tabPanel("Plot", plotOutput('plot1')), + tabPanel("K-means clusters plot", plotOutput('plot1')), tabPanel("Summary", verbatimTextOutput("summary")), tabPanel("Table", tableOutput("table")) ) -- GitLab From 95658d8aa1a2cc4f6b23cd70547a5bd061c7a42c Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:36:19 +0100 Subject: [PATCH 10/14] update render selectedData table exercise with hints and visual solution --- shiny_tutorial.Rmd | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index 3616fa5..f27dda1 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -208,6 +208,103 @@ pageWithSidebar( # } ``` +### Générer un tableau des données sélectionnées pour le graphique + +Afficher le tableau dynamique avec renderTable{()} représentant le tableau utilisé pour générer le graphique et ranger le résultat dans output$table. Représenter cette table côté UI dans le tabPanel « Table ». + +```{r server_R_render_table, exercise=TRUE, context = "server", exercise.warn_invisible=TRUE} +# function(input, output, session) { +# ajouter votre code ci-dessous + +# } +``` + +```{r server_R_render_table-hint-1} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$table <- renderTable({...}) + +# } +``` + +```{r server_R_render_table-hint-2} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$table <- renderTable({ + selectedData() + }) + +# } +``` + +```{r server_R_render_table-solution} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$table <- renderTable({ + selectedData() + }) + +# } +``` + +### Solution + +Et voilà ce que contient `output$table`: + +```{r server_R_render_table-display, echo=FALSE} +vars <- setdiff(names(iris), "Species") + +pageWithSidebar( + headerPanel('Iris: print selected data table'), + sidebarPanel( + selectInput('xcol_tbl', 'X Variable', vars), + selectInput('ycol_tbl', 'Y Variable', vars, selected = vars[[2]]), + numericInput('clusters_tbl', 'Cluster count', 3, min = 1, max = 9) + ), + mainPanel( + tabsetPanel(type = "tabs", + tabPanel("Table", DT::dataTableOutput("tbl_selectedData")) + ) + ) +) +``` + +```{r server_R_render_table-print, context = "server"} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Combine the selected variables into a new data frame + tblselectedData <- reactive({ + iris[, c(input$xcol_tbl, input$ycol_tbl)] + }) + + output$tbl_selectedData <- DT::renderDataTable( + DT::datatable( + tblselectedData(), + options = list( + dom = 'Bfrtip', + lengthMenu = list(c(5, 15, -1), c('5', '15', 'All')), + pageLength = 15, + buttons = list( + list( + extend = "collection", + text = 'Show All', + action = DT::JS("function ( e, dt, node, config ) { + dt.page.len(-1); + dt.ajax.reload(); + }") + ) + ) + ) + ) + ) + +# } +``` + clusters <- reactive({ kmeans(selectedData(), input$clusters) }) -- GitLab From 6cfa8980fc00a83709a64ada9761466c756f3f09 Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:37:15 +0100 Subject: [PATCH 11/14] update summary selectedData exercise with hints and visual solution --- shiny_tutorial.Rmd | 99 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index f27dda1..7ecc6fc 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -302,6 +302,105 @@ pageWithSidebar( ) ) +# } +``` + +### Générer un résumé statistique du tableau dynamique + +Générer un texte dynamique avec renderPrint({}) représentant un résumé statistique du tableau dynamique généré précédemment avec la fonction summary() et ranger le résultat dans output$summary, puis le représenter côté UI dans le tabPanel « Summary ». + +```{r server_R_render_print, exercise=TRUE, context = "server", exercise.warn_invisible=TRUE} +# function(input, output, session) { +# ajouter votre code ci-dessous + +# } +``` + +```{r server_R_render_print-hint-1} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Generate a summary of the data ---- + output$summary <- renderPrint({...}) + +# } +``` + +```{r server_R_render_print-hint-2} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Generate a summary of the data ---- + output$summary <- renderPrint({ + summary(...) + }) + +# } +``` + +```{r server_R_render_print-hint-3} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Generate a summary of the data ---- + output$summary <- renderPrint({ + summary(selectedData()) + }) + +# } +``` + +```{r server_R_render_print-solution} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Generate a summary of the data ---- + output$summary <- renderPrint({ + summary(selectedData()) + }) + +# } +``` + +### Solution + +Et voilà ce que contient `output$summary`: + +```{r server_R_render_print-display, echo=FALSE} +vars <- setdiff(names(iris), "Species") + +pageWithSidebar( + headerPanel('Iris k-means clustering'), + sidebarPanel( + selectInput('xcol_smry', 'X Variable', vars), + selectInput('ycol_smry', 'Y Variable', vars, selected = vars[[2]]), + numericInput('clusters_smry', 'Cluster count', 3, min = 1, max = 9) + ), + mainPanel( + tabsetPanel(type = "tabs", + tabPanel("Summary", verbatimTextOutput("print_summary")) + ) + ) +) +``` + +```{r server_R_render_print-print, context = "server"} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Combine the selected variables into a new data frame + smryselectedData <- reactive({ + iris[, c(input$xcol_smry, input$ycol_smry)] + }) + + smryclusters <- reactive({ + kmeans(smryselectedData(), input$clusters_smry) + }) + + output$print_summary <- renderPrint({ + summary(smryselectedData()) + }) + # } ``` -- GitLab From 5b1b103b5a14a2fca2b9a6f05e9757f4f3fdcc9e Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:38:10 +0100 Subject: [PATCH 12/14] update k-means clustering exercise with hints and visual solution --- shiny_tutorial.Rmd | 91 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index 7ecc6fc..8f4e847 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -404,10 +404,99 @@ pageWithSidebar( # } ``` +### Générer le clustering k-means dans une fonction reactive({}) + +Créer une reactive avec reactive({}) pour générer un cluster sur le tableau dynamique précédent, utilisant la variable « Cluster count » comme nombre de clusters à créer et ranger ce résultat dans une variable « clusters ». Utiliser la fonction kmeans() pour générer ces clusters. + +```{r server_R_clusters, exercise=TRUE, exercise.warn_invisible=TRUE} +# function(input, output, session) { +# ajouter votre code ci-dessous + +# } +``` + +```{r server_R_clusters-hint-1} +# function(input, output, session) { +# ajouter votre code ci-dessous + + clusters <- reactive({...}) + +# } +``` + +```{r server_R_clusters-hint-2} +# function(input, output, session) { +# ajouter votre code ci-dessous + + clusters <- reactive({ + kmeans(...) + }) + +# } +``` + +```{r server_R_clusters-hint-3} +# function(input, output, session) { +# ajouter votre code ci-dessous + clusters <- reactive({ kmeans(selectedData(), input$clusters) }) -} + +# } +``` + +```{r server_R_clusters-solution} +# function(input, output, session) { +# ajouter votre code ci-dessous + + clusters <- reactive({ + kmeans(selectedData(), input$clusters) + }) + +# } +``` + +### Solution + +Et voilà ce que contient `clusters`: + +```{r server_R_clusters-display, echo=FALSE} +vars <- setdiff(names(iris), "Species") + +pageWithSidebar( + headerPanel('Iris print k-means clustering results'), + sidebarPanel( + selectInput('xcol_km', 'X Variable', vars), + selectInput('ycol_km', 'Y Variable', vars, selected = vars[[2]]), + numericInput('clusters_km', 'Cluster count', 3, min = 1, max = 9) + ), + mainPanel( + tabsetPanel(type = "tabs", + tabPanel("K-means clusters", verbatimTextOutput("km_clusters")) + ) + ) +) +``` + +```{r server_R_clusters-print, context = "server"} +# function(input, output, session) { +# ajouter votre code ci-dessous + + # Combine the selected variables into a new data frame + kmselectedData <- reactive({ + iris[, c(input$xcol_km, input$ycol_km)] + }) + + kmclusters <- reactive({ + kmeans(kmselectedData(), input$clusters_km) + }) + + output$km_clusters <- renderPrint({ + kmclusters() + }) + +# } ``` ### Générer le plot dynamique du clustering kmeans -- GitLab From f5a615a5967820045826544e91e0c3b62eba2e32 Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:39:05 +0100 Subject: [PATCH 13/14] update plot k-means clustering results exercise with hints and visual solution --- shiny_tutorial.Rmd | 182 ++++++++++++++++++++++++++++++--------------- 1 file changed, 121 insertions(+), 61 deletions(-) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index 8f4e847..8550aa0 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -503,23 +503,94 @@ pageWithSidebar( Générer un graphique dynamique avec renderPlot{()} représentant le tableau dynamique avec la fonction plot() et colorer les points selon le cluster auquel ils appartiennent avec le paramètre « col ». Pour récupérer les clusters depuis la variable « clusters », utiliser clusters()\$cluster. Ranger le résultat dans output\$plot1 et le représenter côté UI dans le tabPanel « Plot ». -```{r server_R_render_plot, exercise=TRUE} -function(input, output, session) { +```{r server_R_render_plot, exercise=TRUE, exercise.warn_invisible=TRUE} +# function(input, output, session) { +# ajouter votre code ci-dessous -} +# } ``` -```{r server_R_render_plot-solution} -function(input, output, session) { - - # Combine the selected variables into a new data frame - selectedData <- reactive({ - iris[, c(input$xcol, input$ycol)] +```{r server_R_render_plot-hint-1} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$plot1 <- renderPlot({...}) + +# } +``` + +```{r server_R_render_plot-hint-2} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$plot1 <- renderPlot({ + # create a 9 colors palette + palette(...) + }) - - clusters <- reactive({ - kmeans(selectedData(), input$clusters) + +# } +``` + +```{r server_R_render_plot-hint-3} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$plot1 <- renderPlot({ + # create a 9 colors palette + palette(...) + + # define margins: replace *_margin placeholders by real values + par(mar = c(bottom_margin, left_margin, top_margin, right_margin)) + }) + +# } +``` + +```{r server_R_render_plot-hint-4} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$plot1 <- renderPlot({ + # create a 9 colors palette + palette(...) + + # define margins: replace *_margin placeholders by real values + par(mar = c(bottom_margin, left_margin, top_margin, right_margin)) + + # create the plot + plot(selectedData(), + ...) + + }) + +# } +``` + +```{r server_R_render_plot-hint-5} +# function(input, output, session) { +# ajouter votre code ci-dessous + + output$plot1 <- renderPlot({ + # create a 9 colors palette + palette(...) + + # define margins: replace *_margin placeholders by real values + par(mar = c(bottom_margin, left_margin, top_margin, right_margin)) + + # create the plot: set the points color, shape, etc. + plot(selectedData(), + ...) + # add the cluster centers: set the points color, shape, etc. + points(clusters()$centers, ...) }) + +# } +``` + +```{r server_R_render_plot-hint-6} +# function(input, output, session) { +# full solution output$plot1 <- renderPlot({ palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", @@ -531,30 +602,13 @@ function(input, output, session) { pch = 20, cex = 3) points(clusters()$centers, pch = 4, cex = 4, lwd = 4) }) -} -``` - -### Générer un résumé statistique du tableau dynamique - -Générer un texte dynamique avec renderPrint({}) représentant un résumé statistique du tableau dynamique généré précédemment avec la fonction summary() et ranger le résultat dans output$summary, puis le représenter côté UI dans le tabPanel « Summary ». -```{r server_R_render_print, exercise=TRUE} -function(input, output, session) { - -} +# } ``` -```{r server_R_render_print-solution} -function(input, output, session) { - - # Combine the selected variables into a new data frame - selectedData <- reactive({ - iris[, c(input$xcol, input$ycol)] - }) - - clusters <- reactive({ - kmeans(selectedData(), input$clusters) - }) +```{r server_R_render_plot-solution, context="server"} +# function(input, output, session) { +# ajouter votre code ci-dessous output$plot1 <- renderPlot({ palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", @@ -567,55 +621,61 @@ function(input, output, session) { points(clusters()$centers, pch = 4, cex = 4, lwd = 4) }) - # Generate a summary of the data ---- - output$summary <- renderPrint({ - summary(selectedData()) - }) -} +# } ``` -### Générer un tableau des données sélectionnées pour le graphique +### Solution -Afficher le tableau dynamique avec renderTable{()} représentant le tableau utilisé pour générer le graphique et ranger le résultat dans output$table. Représenter cette table côté UI dans le tabPanel « Table ». +Et voilà ce que contient `output$plot1`: -```{r server_R_render_table, exercise=TRUE} -function(input, output, session) { +```{r server_R_render_plot-display, echo=FALSE} +vars <- setdiff(names(iris), "Species") -} +pageWithSidebar( + headerPanel('Iris plot k-means clustering results'), + sidebarPanel( + selectInput('xcol_plot', 'X Variable', vars), + selectInput('ycol_plot', 'Y Variable', vars, selected = vars[[2]]), + numericInput('clusters_plot', 'Cluster count', 3, min = 1, max = 9) + ), + mainPanel( + tabsetPanel(type = "tabs", + tabPanel("K-means clusters plot", plotOutput("km_plot")), + tabPanel("K-means clusters", verbatimTextOutput("print_clusters")) + ) + ) +) ``` -```{r server_R_render_table-solution} -function(input, output, session) { +```{r server_R_render_plot-print, context = "server"} +# function(input, output, session) { +# ajouter votre code ci-dessous # Combine the selected variables into a new data frame - selectedData <- reactive({ - iris[, c(input$xcol, input$ycol)] + plotselectedData <- reactive({ + iris[, c(input$xcol_plot, input$ycol_plot)] }) - clusters <- reactive({ - kmeans(selectedData(), input$clusters) + plotclusters <- reactive({ + kmeans(plotselectedData(), input$clusters_plot) }) - output$plot1 <- renderPlot({ + output$print_clusters <- renderPrint({ + plotclusters() + }) + + output$km_plot <- renderPlot({ palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999")) par(mar = c(5.1, 4.1, 0, 1)) plot(selectedData(), - col = clusters()$cluster, + col = plotclusters()$cluster, pch = 20, cex = 3) - points(clusters()$centers, pch = 4, cex = 4, lwd = 4) + points(plotclusters()$centers, pch = 4, cex = 4, lwd = 4) }) - # Generate a summary of the data ---- - output$summary <- renderPrint({ - summary(selectedData()) - }) - - output$table <- renderTable({ - selectedData() - }) -} +# } ``` ## Application Shiny complète -- GitLab From 45f26ac22f6732dbfb97981ea678a276edb140cf Mon Sep 17 00:00:00 2001 From: Joseph Tran <joseph.tran@inrae.fr> Date: Wed, 20 Mar 2024 18:39:49 +0100 Subject: [PATCH 14/14] add extra lines --- shiny_tutorial.Rmd | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/shiny_tutorial.Rmd b/shiny_tutorial.Rmd index 8550aa0..bae35df 100644 --- a/shiny_tutorial.Rmd +++ b/shiny_tutorial.Rmd @@ -56,7 +56,7 @@ Deux fichier sont automatiquement générés : `ui.R` et `server.R`. Lancer l’ * Changer le titre de l’application. On pourra l’appeler My first application. * Mettre à jour et vérifier que le titre a bien été changé. - + ### ui.R Voici un exemple de `ui.R` que nous allons utiliser. Lancer le code avec le bouton `Run code` pour voir le rendu. @@ -132,11 +132,11 @@ Créer une reactive avec reactive({}) pour générer un tableau dynamique récup ```{r server_R_selected_data-hint-3} # function(input, output, session) { # ajouter votre code ci-dessous - + # Combine the selected variables into a new data frame selectedData <- reactive({ iris[, c(input$xcol, input$ycol)] - }) +}) # } ``` @@ -144,7 +144,7 @@ Créer une reactive avec reactive({}) pour générer un tableau dynamique récup ```{r server_R_selected_data-solution} # function(input, output, session) { # ajouter votre code ci-dessous - + # Combine the selected variables into a new data frame selectedData <- reactive({ iris[, c(input$xcol, input$ycol)] @@ -207,7 +207,7 @@ pageWithSidebar( # } ``` - + ### Générer un tableau des données sélectionnées pour le graphique Afficher le tableau dynamique avec renderTable{()} représentant le tableau utilisé pour générer le graphique et ranger le résultat dans output$table. Représenter cette table côté UI dans le tabPanel « Table ». @@ -591,7 +591,7 @@ Générer un graphique dynamique avec renderPlot{()} représentant le tableau dy ```{r server_R_render_plot-hint-6} # function(input, output, session) { # full solution - + output$plot1 <- renderPlot({ palette(c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", "#A65628", "#F781BF", "#999999")) @@ -650,16 +650,16 @@ pageWithSidebar( ```{r server_R_render_plot-print, context = "server"} # function(input, output, session) { # ajouter votre code ci-dessous - + # Combine the selected variables into a new data frame plotselectedData <- reactive({ iris[, c(input$xcol_plot, input$ycol_plot)] }) - + plotclusters <- reactive({ kmeans(plotselectedData(), input$clusters_plot) }) - + output$print_clusters <- renderPrint({ plotclusters() }) @@ -674,7 +674,7 @@ pageWithSidebar( pch = 20, cex = 3) points(plotclusters()$centers, pch = 4, cex = 4, lwd = 4) }) - + # } ``` -- GitLab