CommencerCommencer gratuitement

Afficher ou masquer des champs requis selon le contexte

L’application de nuage de mots propose désormais trois façons de fournir les mots au nuage. Deux de ces méthodes s’appuient sur un élément d’interface spécifique qui ne leur est utile qu’à elles : une zone de texte n’est utilisée que lorsque l’utilisateur sélectionne la source de mots "own", et un champ de téléversement de fichier n’est pertinent que lorsque l’utilisateur choisit la source "file". Idéalement, seuls les champs nécessaires devraient apparaître à un instant donné.

Cet exercice fait partie du cours

Études de cas : créer des applications web avec Shiny en R

Afficher le cours

Instructions

La zone de texte est déjà enveloppée dans un conditionalPanel() afin qu’elle n’apparaisse que lorsque l’utilisateur saisit son propre texte. Votre tâche consiste à n’afficher le sélecteur de fichier que lorsque l’utilisateur choisit l’envoi de fichier comme source de données. Plus précisément :

  • Encapsulez le champ de téléversement de fichier dans un panneau conditionnel (ligne 19).
  • La condition du panneau doit être remplie lorsque l’utilisateur sélectionne l’option "file" parmi les boutons radio de la source de données (ligne 22).

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

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)
Modifier et exécuter le code