Reactieve variabelen verminderen code-duplicatie
In de vorige oefeningen wordt de code om gapminder te filteren op basis van de invoerwaarden drie keer herhaald: één keer in de tabel, één keer in de grafiek en één keer in de downloadhandler.
Reactieve variabelen kunnen worden gebruikt om code-duplicatie te verminderen. Dat is doorgaans een goed idee, omdat het onderhoud eenvoudiger maakt.
Deze oefening maakt deel uit van de cursus
Casestudies: webapplicaties bouwen met Shiny in R
Oefeninstructies
De dubbele codeblokken die de data filteren zijn verwijderd. Jij voegt een reactieve variabele toe die de data filtert en gebruikt voortaan die variabele. Concreet:
- Maak een reactieve variabele
filtered_datamet de functiereactive()die de filtercode uit de vorige oefening gebruikt (regel 15). - Gebruik de reactieve variabele om de tabeloutput, de grafiekoutput en het downloadbestand te genereren (regels 33, 42 en 50).
Interactieve oefening met praktijkervaring
Probeer deze oefening door deze voorbeeldcode aan te vullen.
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)