Aan de slagBegin gratis

Vereiste invoervelden voorwaardelijk tonen of verbergen

De wordcloud-app heeft nu drie manieren om woorden aan te leveren voor de wordcloud. Twee van deze methoden gebruiken een specifiek UI-element dat alleen voor hen nuttig is: er is een tekstvak dat alleen wordt gebruikt wanneer de gebruiker de bron "own" selecteert, en er is een bestandsupload die alleen relevant is wanneer de gebruiker de bron "file" kiest. Idealiter verschijnen op elk moment alleen de invoervelden die nodig zijn.

Deze oefening maakt deel uit van de cursus

Casestudies: webapplicaties bouwen met Shiny in R

Bekijk cursus

Oefeninstructies

Het tekstvak is al verpakt in een conditionalPanel() zodat het alleen verschijnt wanneer de gebruiker ervoor kiest om eigen tekst in te voeren. Jouw taak is om de bestandsupload alleen te tonen wanneer de gebruiker de bestandsupload als databron selecteert. Concreet:

  • Verpak de bestandsupload in een conditional panel (regel 19).
  • De voorwaarde voor het paneel moet waar zijn wanneer de gebruiker de optie "file" kiest bij de radioknoppen voor de databron (regel 22).

Interactieve oefening met praktijkervaring

Probeer deze oefening door deze voorbeeldcode aan te vullen.

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)
Code bewerken en uitvoeren