Mostrar u ocultar entradas obligatorias según la condición
La app de nubes de palabras ahora tiene tres formas distintas de proporcionar palabras a la nube. Dos de estos métodos usan un elemento específico de la interfaz que solo resulta útil para ellos: hay un área de texto que solo se usa cuando el usuario selecciona la fuente de palabras "own", y hay una entrada de archivo que solo es relevante cuando el usuario elige la fuente "file". Lo ideal sería que, en cada momento, solo aparecieran las entradas necesarias.
Este ejercicio forma parte del curso
Casos prácticos: crea aplicaciones web con Shiny en R
Instrucciones del ejercicio
El área de texto ya está envuelta en un conditionalPanel() para que solo aparezca cuando el usuario elige introducir su propio texto. Tu tarea es mostrar condicionalmente la entrada de archivo solo cuando el usuario seleccione la carga de archivos como fuente de datos. En concreto:
- Envuelve la entrada de archivo en un panel condicional (línea 19).
- La condición del panel debe cumplirse cuando el usuario elija la opción "file" en los botones de opción de la fuente de datos (línea 22).
Ejercicio interactivo práctico
Prueba este ejercicio y completa el código de muestra.
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)