Afișează sau ascunde condiționat câmpurile obligatorii
Aplicația pentru norul de cuvinte are acum trei moduri diferite de a furniza cuvinte. Două dintre aceste metode implică un element de UI specific, util doar pentru ele: există un câmp textarea folosit doar când utilizatorul selectează sursa de cuvinte „own", și un câmp de încărcare a fișierului relevant doar când utilizatorul alege sursa „file". Ideal ar fi ca doar câmpurile necesare să fie afișate la un moment dat.
Acest exercițiu face parte din cursul
Studii de caz: Construirea aplicațiilor web cu Shiny în R
Instrucțiuni pentru exercițiu
Câmpul textarea a fost deja inclus într-un conditionalPanel(), astfel încât să apară doar când utilizatorul alege să introducă propriul text. Sarcina ta este să afișezi condiționat câmpul de încărcare a fișierului numai când utilizatorul selectează această opțiune ca sursă de date. Mai concret:
- Înfășoară câmpul de încărcare a fișierului într-un panou condiționat (linia 19).
- Condiția panoului trebuie să fie îndeplinită când utilizatorul alege opțiunea „file" din butoanele radio pentru sursa de date (linia 22).
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
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)