Не створюйте нові хмаринки слів безперервно
У застосунку для хмаринки слів тепер є кілька різних полів введення, і зміна кожного з них спричиняє перемальовування хмаринки з новими параметрами — як і очікується.
Але інколи така поведінка може дратувати. Наприклад, коли ви вводите текст у поле textarea, хмаринка слів постійно перегенеровується, не чекаючи, поки ви закінчите. Це можна контролювати за допомогою isolate().
Увесь код усередині renderWordcloud2(), який відповідає за візуалізацію хмаринки слів, було вилучено. Ваше завдання — відновити хмаринку слів і ізолювати її так, щоб зміна параметрів не запускала автоматичне створення нової хмаринки.
Ця вправа є частиною курсу
Case Studies: створення вебзастосунків із Shiny в R
Інструкції до вправи
- Переконайтеся, що вся функція створення хмаринки слів ізольована (рядок 54).
- Передайте аргументи до
create_wordcloud()з потрібних полів введення та реактивних змінних. Аргументи функції:data,num_wordsіbackground(рядок 56).
Результат може виглядати так, ніби застосунок зламано, тому що ви не зможете створити нову хмаринку слів. Це ми виправимо у наступній вправі.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
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)