Mostra o nascondi gli input richiesti in modo condizionale
L'app della word cloud ora offre tre modi diversi per fornire le parole. Due di questi prevedono un elemento della UI utile solo in quei casi: c'è una textarea usata solo quando l'utente seleziona la sorgente "own", e c'è un input file rilevante solo quando l'utente sceglie la sorgente "file". Idealmente, in ogni momento dovrebbero apparire solo gli input necessari.
Questo esercizio fa parte del corso
Casi di studio: creare applicazioni web con Shiny in R
Istruzioni dell'esercizio
La textarea è già stata racchiusa in un conditionalPanel() così da apparire solo quando l'utente decide di inserire il proprio testo. Il tuo compito è mostrare in modo condizionale l'input del file solo quando l'utente seleziona il caricamento del file come sorgente dei dati. In particolare:
- Racchiudi l'input del file in un pannello condizionale (riga 19).
- La condizione del pannello deve essere soddisfatta quando l'utente sceglie l'opzione "file" dai pulsanti di scelta della sorgente dati (riga 22).
Esercizio pratico interattivo
Prova a risolvere questo esercizio completando il codice di esempio.
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)