Reaktiva variabler minskar kodduplicering
I de tidigare övningarna förekommer koden för att filtrera gapminder utifrån indatavärdena tre gånger: en gång i tabellen, en gång i diagrammet och en gång i nedladdningshanteraren.
Reaktiva variabler kan användas för att minska kodduplicering, vilket i allmänhet är en bra idé eftersom det gör koden lättare att underhålla.
Den här övningen är en del av kursen
Fallstudier: Bygg webbapplikationer med Shiny i R
Övningsinstruktioner
De duplicerade kodblock som filtrerar data har tagits bort. Din uppgift är att lägga till en reaktiv variabel som filtrerar data och använda den variabeln i stället. Mer specifikt:
- Skapa en reaktiv variabel med namnet
filtered_datamed hjälp av funktionenreactive(), som använder filtreringskoden från den föregående övningen (rad 15). - Använd den reaktiva variabeln för att rendera tabellutdata, diagramutdata och nedladdningsfilen (raderna 33, 42 och 50).
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
ui <- fluidPage(
h1("Gapminder"),
sliderInput(inputId = "life", label = "Life expectancy",
min = 0, max = 120,
value = c(30, 50)),
selectInput("continent", "Continent",
choices = c("All", levels(gapminder$continent))),
downloadButton(outputId = "download_data", label = "Download"),
plotOutput("plot"),
tableOutput("table")
)
server <- function(input, output) {
# Create a reactive variable named "filtered_data"
filtered_data <- ___({
# Filter the data (copied from previous exercise)
data <- gapminder
data <- subset(
data,
lifeExp >= input$life[1] & lifeExp <= input$life[2]
)
if (input$continent != "All") {
data <- subset(
data,
continent == input$continent
)
}
data
})
output$table <- renderTable({
# Use the filtered_data variable to render the table output
data <- ___
data
})
output$download_data <- downloadHandler(
filename = "gapminder_data.csv",
content = function(file) {
# Use the filtered_data variable to create the data for
# the downloaded file
data <- ___
write.csv(data, file, row.names = FALSE)
}
)
output$plot <- renderPlot({
# Use the filtered_data variable to create the data for
# the plot
data <- ___
ggplot(data, aes(gdpPercap, lifeExp)) +
geom_point() +
scale_x_log10()
})
}
shinyApp(ui, server)