Skapa inte nya ordmoln i onödan
Ordmolnsappen har nu flera olika indata, och när du ändrar något av dem ritas ordmolnet om med de nya parametrarna – precis som förväntat.
Detta beteende kan dock vara störande ibland. Till exempel: när du skriver i textfältet genereras ordmolnet om gång på gång, utan att vänta på att du ska bli klar. Det kan styras med isolate().
All kod inuti renderWordcloud2() som ritar ordmolnet har tagits bort. Din uppgift är att återskapa ordmolnet och isolera det, så att ändringar i parametrarna inte automatiskt utlöser ett nytt ordmoln.
Den här övningen är en del av kursen
Fallstudier: Bygg webbapplikationer med Shiny i R
Övningsinstruktioner
- Se till att hela funktionen som genererar ordmolnet är isolerad (rad 54).
- Ange argumenten till
create_wordcloud()med hjälp av nödvändiga indata och reaktiva variabler. Funktionens argument ärdata,num_wordsochbackground(rad 56).
Resultatet kan verka som att appen har slutat fungera, eftersom du inte kan skapa ett nytt ordmoln – men det åtgärdas i en kommande övning.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
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)