Non creare continuamente nuove word cloud
L'app della word cloud ora ha diversi input e modificarne uno qualsiasi fa ridisegnare la word cloud con il nuovo set di parametri, proprio come previsto.
Tuttavia, a volte questo comportamento può risultare fastidioso. Ad esempio, quando digiti del testo nella textarea, la word cloud continua a rigenerarsi senza aspettare che tu finisca di scrivere. Questo si può controllare con isolate().
Tutto il codice dentro renderWordcloud2() che disegna la word cloud è stato rimosso. Il tuo compito è ricreare la word cloud e isolarla in modo che la modifica dei parametri non avvii automaticamente una nuova word cloud.
Questo esercizio fa parte del corso
Casi di studio: creare applicazioni web con Shiny in R
Istruzioni dell'esercizio
- Assicurati che l'intera funzione che genera la word cloud sia isolata (riga 54).
- Fornisci gli argomenti a
create_wordcloud()usando gli input e le variabili reattive necessari. Gli argomenti della funzione sonodata,num_wordsebackground(riga 56).
Il risultato potrà sembrare che l'app sia rotta perché non potrai creare una nuova word cloud, ma lo affronteremo in un esercizio successivo.
Esercizio pratico interattivo
Prova a risolvere questo esercizio completando il codice di esempio.
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")
),
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({
# Isolate the code to render the word cloud so that it will
# not automatically re-render on every parameter change
___({
# Render the word cloud using inputs and reactives
create_wordcloud(data = ___, num_words = ___,
background = ___)
})
})
}
shinyApp(ui = ui, server = server)