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
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)