Hiển thị hoặc ẩn các trường bắt buộc theo điều kiện
Ứng dụng word cloud hiện có ba cách khác nhau để cung cấp từ cho word cloud. Hai trong số các phương thức này liên quan đến một phần tử UI chỉ hữu ích cho riêng chúng: có một textarea chỉ dùng khi người dùng chọn nguồn từ "own", và có một trường nhập tệp chỉ liên quan khi người dùng chọn nguồn "file". Lý tưởng nhất là chỉ những trường nhập cần thiết mới xuất hiện tại từng thời điểm.
Bài tập này là một phần của khóa học
Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R
Hướng dẫn bài tập
Textarea đã được bọc trong conditionalPanel() để chỉ xuất hiện khi người dùng chọn nhập văn bản của riêng họ. Nhiệm vụ của bạn là chỉ hiển thị trường nhập tệp khi người dùng chọn tải tệp lên làm nguồn dữ liệu. Cụ thể:
- Bọc trường nhập tệp trong một conditional panel (dòng 19).
- Điều kiện của panel cần thỏa khi người dùng chọn tùy chọn "file" từ các nút radio của nguồn dữ liệu (dòng 22).
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
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)
),
# Wrap the file input in a conditional panel
___(
# The condition should be that the user selects
# "file" from the radio buttons
condition = ___,
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({
create_wordcloud(data_source(), num_words = input$num,
background = input$col)
})
}
shinyApp(ui = ui, server = server)