Aan de slagBegin gratis

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

Bekijk cursus

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_data met de functie reactive() 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)
Code bewerken en uitvoeren