Las variables reactivas reducen la duplicación de código
En los ejercicios anteriores, el código que filtra gapminder según los valores de entrada está duplicado tres veces: una en la tabla, otra en el gráfico y otra en el manejador de descarga.
Las variables reactive pueden usarse para reducir la duplicación de código, lo cual en general es una buena idea porque facilita el mantenimiento.
Este ejercicio forma parte del curso
Casos prácticos: crea aplicaciones web con Shiny en R
Instrucciones del ejercicio
Se han eliminado los fragmentos de código duplicados que filtraban los datos. Tu tarea es añadir una variable reactiva que filtre los datos y usar esta variable en su lugar. En concreto:
- Crea una variable reactiva llamada
filtered_datausando la funciónreactive()que emplee el código de filtrado del ejercicio anterior (línea 15). - Usa la variable reactiva para generar la salida de la tabla, la salida del gráfico y el archivo de descarga (líneas 33, 42 y 50).
Ejercicio interactivo práctico
Prueba este ejercicio y completa el código de muestra.
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)