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 interattivo pratico
Prova questo esercizio completando questo 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)