Kom igångKom igång gratis

Visa eller dölj inmatningsfält villkorsstyrt

Ordmolnsappen har nu tre olika sätt att mata in ord till ordmolnet. Två av dessa metoder använder ett specifikt UI-element som bara är relevant för dem: det finns ett textområde som bara används när användaren väljer ordkällan "own", och det finns en filinmatning som bara är relevant när användaren väljer källan "file". Helst ska bara de inmatningsfält som behövs visas vid varje givet tillfälle.

Den här övningen är en del av kursen

Fallstudier: Bygg webbapplikationer med Shiny i R

Visa kurs

Övningsinstruktioner

Textområdet har redan wrappats in i ett conditionalPanel() så att det bara visas när användaren väljer att mata in egen text. Din uppgift är att visa filinmatningen villkorsstyrt – det vill säga bara när användaren väljer filuppladdning som datakälla. Mer specifikt:

  • Omslut filinmatningen i en villkorsstyrd panel (rad 19).
  • Villkoret för panelen ska uppfyllas när användaren väljer alternativet "file" från radioknapparnas datakälla (rad 22).

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

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)
Redigera och kör kod