CommencezCommencez gratuitement

Afficher ou masquer des champs requis selon le contexte

L'application de nuage de mots offre maintenant trois façons différentes de fournir des mots au nuage. Deux de ces méthodes nécessitent un élément d'interface précis qui ne sert qu'à elles : une zone de texte n'est utilisée que lorsque l'utilisateur ou l'utilisatrice choisit la source « own », et un champ d'importation de fichier n'est pertinent que lorsque la source « file » est sélectionnée. Idéalement, seuls les champs nécessaires devraient s'afficher à un moment donné.

Cette activité fait partie du cours

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

Voir le cours

Instructions de l’exercice

La zone de texte est déjà encapsulée dans un conditionalPanel() pour qu'elle n'apparaisse que lorsque la personne utilisatrice saisit son propre texte. Votre tâche consiste à afficher le champ d'importation de fichier seulement lorsque l'utilisateur ou l'utilisatrice sélectionne le téléversement de fichier comme source de données. Plus précisément :

  • Encapsulez le champ d'importation de fichier dans un panneau conditionnel (ligne 19).
  • La condition du panneau doit être satisfaite lorsque la personne choisit l'option « file » dans les boutons radio de la source de données (ligne 22).

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

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