Generowanie nowej chmury słów na żądanie
Po odizolowaniu kodu renderującego chmurę słów, tak aby nie aktualizowała się zbyt często, ostatnim krokiem jest umożliwienie jej renderowania wyłącznie wtedy, gdy użytkownik tego chce. Można to osiągnąć za pomocą funkcji actionButton().
To ćwiczenie jest częścią kursu
Studia przypadków: tworzenie aplikacji webowych w Shiny w R
Instrukcje do ćwiczenia
Twoim zadaniem jest dodanie przycisku do aplikacji Shiny i ponowne renderowanie chmury słów po jego kliknięciu. Konkretnie:
- Dodaj przycisk akcji do aplikacji z ID wejściowym "draw" i etykietą "Draw!" (linia 26).
- Dodaj przycisk jako zależność w funkcji renderującej chmurę słów, tak aby chmura odświeżała się po jego naciśnięciu (linia 56).
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
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)