LoslegenKostenlos loslegen

Erforderliche Eingaben abhängig ein- oder ausblenden

Die Wordcloud-App hat jetzt drei verschiedene Möglichkeiten, Wörter für die Wordcloud bereitzustellen. Zwei dieser Methoden benötigen ein spezielles UI-Element, das nur für sie sinnvoll ist: Es gibt ein Textfeld, das nur verwendet wird, wenn die Nutzerin oder der Nutzer die Quelle "own" auswählt, und es gibt ein Datei-Upload, das nur relevant ist, wenn die Quelle "file" gewählt wird. Ideal wäre, wenn jeweils nur die benötigten Eingaben angezeigt werden.

Diese Übung ist Teil des Kurses

Fallstudien: Webanwendungen mit Shiny in R erstellen

Kurs anzeigen

Anleitung zur Übung

Das Textfeld wurde bereits in ein conditionalPanel() gepackt, sodass es nur erscheint, wenn eigene Texte eingegeben werden. Deine Aufgabe ist es, das Datei-Upload-Element nur dann anzuzeigen, wenn als Datenquelle der Datei-Upload ausgewählt wird. Konkret:

  • Wickle das Datei-Upload-Element in ein Conditional Panel (Zeile 19).
  • Die Bedingung des Panels soll erfüllt sein, wenn in den Radiobuttons für die Datenquelle (Zeile 22) die Option "file" gewählt wird.

Interaktive Übung

Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.

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 bearbeiten und ausführen