Shiny Avanzado
Introducción
En esta sección exploraremos características avanzadas de Shiny
para construir aplicaciones más robustas, modulares e interactivas. Aprenderemos a usar componentes reactivos complejos, separar la lógica en archivos, incorporar gráficos interactivos, y mejorar la experiencia de usuario.
1. Separación en archivos: app.R
, ui.R
, server.R
Para aplicaciones grandes, es recomendable separar el código:
Archivo ui.R
:
library(shiny)
fluidPage(
titlePanel("App modular"),
sidebarLayout(
sidebarPanel(
selectInput("col", "Columna:", choices = names(mtcars))
),mainPanel(
plotOutput("hist")
)
) )
Archivo server.R
:
function(input, output) {
$hist <- renderPlot({
outputhist(mtcars[[input$col]])
}) }
Archivo app.R
:
<- source("ui.R")$value
ui <- source("server.R")$value
server
shinyApp(ui = ui, server = server)
2. Uso de reactive()
<- function(input, output) {
server <- reactive({
datos_filtrados $cyl == input$cyl, ]
mtcars[mtcars
})
$tabla <- renderTable({
outputdatos_filtrados()
}) }
El objeto datos_filtrados()
solo se recalcula cuando input$cyl
cambia.
3. observeEvent()
y eventReactive()
observeEvent()
: ejecuta efectos secundarios (como imprimir, guardar, actualizar)eventReactive()
: solo recalcula cuando un evento específico ocurre
# Usar botón para actualizar
$plot <- renderPlot({
output$boton_actualizar
inputisolate({
hist(rnorm(100))
}) })
4. Descarga de archivos: downloadHandler
$descarga <- downloadHandler(
outputfilename = function() {
paste0("datos-", Sys.Date(), ".csv")
},content = function(file) {
write.csv(mtcars, file)
} )
5. Gráficos interactivos con plotly
library(plotly)
$plotly_plot <- renderPlotly({
outputplot_ly(data = iris, x = ~Sepal.Length, y = ~Petal.Length, color = ~Species)
})
6. Módulos en Shiny
Permiten reusar lógica y UI como funciones:
Módulo UI:
<- function(id) {
mod_plot_ui <- NS(id)
ns plotOutput(ns("plot"))
}
Módulo Server:
<- function(id, data) {
mod_plot_server moduleServer(id, function(input, output, session) {
$plot <- renderPlot({
outputhist(data())
})
}) }
Uso en app:
mod_plot_ui("grafico")
mod_plot_server("grafico", reactive({ mtcars$mpg }))
7. Mejora visual con shinythemes
o bslib
library(shinythemes)
<- fluidPage(
ui theme = shinytheme("flatly"),
titlePanel("App con tema")
)
O bien:
library(bslib)
<- fluidPage(
ui theme = bs_theme(bootswatch = "minty", base_font = font_google("Roboto"))
)
Recursos adicionales
- Libro: https://mastering-shiny.org
- Documentación: https://shiny.posit.co
- Galería de ejemplos: https://shiny.posit.co/gallery/
- Tutorial sobre módulos: https://shiny.rstudio.com/articles/modules.html
Actividad sugerida
Construye una aplicación que incluya:
- Filtros por múltiples variables
- Visualización interactiva (
plotly
) - Descarga de resultados (
downloadHandler
) - Al menos un módulo reutilizable (
moduleServer
)