Tampilkan atau sembunyikan input yang diperlukan secara kondisional
Aplikasi word cloud kini memiliki tiga cara berbeda untuk memasukkan kata ke dalam word cloud. Dua di antaranya memerlukan elemen UI khusus yang hanya berguna untuk metode tersebut: ada sebuah textarea yang hanya digunakan ketika pengguna memilih sumber kata "own", dan ada input berkas yang hanya relevan ketika pengguna memilih sumber "file". Idealnya, hanya input yang diperlukan yang muncul pada waktu tertentu.
Latihan ini adalah bagian dari kursus
Studi Kasus: Membangun Aplikasi Web dengan Shiny di R
Petunjuk latihan
Textarea sudah dibungkus dalam conditionalPanel() sehingga hanya akan muncul saat pengguna memilih untuk memasukkan teks mereka sendiri. Tugas Anda adalah menampilkan input berkas secara kondisional hanya ketika pengguna memilih unggah berkas sebagai sumber data. Secara spesifik:
- Bungkus input berkas dalam sebuah conditional panel (baris 19).
- Kondisi untuk panel harus terpenuhi ketika pengguna memilih opsi "file" dari tombol radio sumber data (baris 22).
Latihan interaktif praktis
Cobalah latihan ini dengan menyelesaikan kode contoh berikut.
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)