Maak op aanvraag een nieuwe wordcloud
Nadat je de rendercode voor de wordcloud hebt geïsoleerd zodat hij niet te vaak wordt vernieuwd, is de laatste stap om een manier te bieden om de wordcloud alleen te renderen wanneer de gebruiker dat wil. Dit kan met behulp van een actionButton().
Deze oefening maakt deel uit van de cursus
Casestudies: webapplicaties bouwen met Shiny in R
Oefeninstructies
Je taak is om een knop toe te voegen aan de Shiny-app en de wordcloud opnieuw te renderen wanneer de knop wordt ingedrukt. Concreet:
- Voeg een action button toe aan de app met input-ID "draw" en het label "Draw!" (regel 26).
- Voeg de knop toe als dependency in de renderfunctie van de wordcloud, zodat de wordcloud opnieuw wordt uitgevoerd wanneer de knop wordt ingedrukt (regel 56).
Interactieve oefening met praktijkervaring
Probeer deze oefening door deze voorbeeldcode aan te vullen.
ui <- fluidPage(
h1("Word Cloud"),
sidebarLayout(
sidebarPanel(
radioButtons(
inputId = "source",
label = "Word source",
choices = c(
"Art of War" = "book",
"Use your own words" = "own",
"Upload a file" = "file"
)
),
conditionalPanel(
condition = "input.source == 'own'",
textAreaInput("text", "Enter text", rows = 7)
),
conditionalPanel(
condition = "input.source == 'file'",
fileInput("file", "Select a file")
),
numericInput("num", "Maximum number of words",
value = 100, min = 5),
colourInput("col", "Background color", value = "white"),
# Add a "draw" button to the app
___(inputId = ___, label = ___)
),
mainPanel(
wordcloud2Output("cloud")
)
)
)
server <- function(input, output) {
data_source <- reactive({
if (input$source == "book") {
data <- artofwar
} else if (input$source == "own") {
data <- input$text
} else if (input$source == "file") {
data <- input_file()
}
return(data)
})
input_file <- reactive({
if (is.null(input$file)) {
return("")
}
readLines(input$file$datapath)
})
output$cloud <- renderWordcloud2({
# Add the draw button as a dependency to
# cause the word cloud to re-render on click
input$___
isolate({
create_wordcloud(data_source(), num_words = input$num,
background = input$col)
})
})
}
shinyApp(ui = ui, server = server)