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