ComenzarEmpieza gratis

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

Ver curso

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)
Editar y ejecutar código