Implementación de aplicaciones Shiny
Publique aplicaciones en shinyapps.io, Shiny Server y entornos con Docker.
Implementación de aplicaciones Shiny es una lección gratuita de R Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.
Descripción general de las opciones de implementación
Las aplicaciones Shiny se pueden implementar en varias plataformas según el presupuesto, el tráfico esperado y los requisitos de control:
- shinyapps.io: alojamiento en la nube gestionado por Posit; es la opción más sencilla y ofrece un nivel gratuito.
- Shiny Server (open source): autohospedado en Linux y gratuito.
- Posit Connect: comercial y de nivel empresarial; también admite R Markdown y Plumber.
- Docker + rocker/shiny: máxima portabilidad y control.
# Summary of deployment options and their trade-offs:
# shinyapps.io: managed, auto-scaling, per-instance pricing
# Shiny Server: self-hosted, unlimited users, needs sysadmin
# Posit Connect: enterprise SSO, scheduling, REST APIs
# Docker: any cloud provider, reproducible environments
cat('Choose based on: scale, budget, infra control needs')Estructura de app.R para la implementación
Una aplicación Shiny que se pueda implementar debe tener un único archivo app.R (que contenga tanto ui como server) o dos archivos, ui.R y server.R. Todas las dependencias de paquetes deben declararse con library() al principio. Los archivos de datos deben estar en el mismo directorio o ser accesibles mediante una ruta relativa a la aplicación.
# Minimal app.R for deployment
library(shiny)
library(ggplot2)
library(dplyr)
# Load data relative to app directory
data <- readRDS('data/processed_data.rds')
ui <- fluidPage(
titlePanel('My Deployed App'),
sidebarLayout(
sidebarPanel(selectInput('var', 'Variable:', choices = names(data))),
mainPanel(plotOutput('main_plot'))
)
)
server <- function(input, output, session) {
output$main_plot <- renderPlot({
ggplot(data, aes_string(x = input$var)) + geom_histogram()
})
}
shinyApp(ui, server)rsconnect::deployApp()
El paquete rsconnect gestiona la implementación en shinyapps.io y Posit Connect. Primero, configure las credenciales de su cuenta y, después, llame a rsconnect::deployApp() desde el directorio de la aplicación. El paquete agrupa automáticamente todos los archivos R, los datos y un manifiesto.
library(rsconnect)
# One-time setup: link your shinyapps.io account
# rsconnect::setAccountInfo(
# name = 'your_account_name',
# token = 'YOUR_TOKEN',
# secret = 'YOUR_SECRET'
# )
# Deploy the app in the current directory
rsconnect::deployApp(
appDir = '.', # or 'path/to/app'
appName = 'my_analysis_app',
forceUpdate = TRUE
)Configuración de shinyapps.io
shinyapps.io es la vía más rápida para obtener una URL pública. Cree una cuenta gratuita en shinyapps.io, copie el token y el secreto desde el panel de control y llame a setAccountInfo(). El nivel gratuito permite tener 5 aplicaciones con 25 horas activas al mes.
library(rsconnect)
# Copy credentials from shinyapps.io -> Account -> Tokens
rsconnect::setAccountInfo(
name = 'your_username',
token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
)
# Verify the connection
rsconnect::accountInfo()
# List currently deployed apps
rsconnect::applications()Shiny Server Open Source
Shiny Server se ejecuta en Linux (Ubuntu/RHEL) y sirve aplicaciones Shiny desde el directorio /srv/shiny-server/. Cada subdirectorio se convierte en una aplicación disponible en http://server:3838/subdirname/. Es gratuito y admite un número ilimitado de usuarios simultáneos (dentro de la capacidad del servidor).
# Install Shiny Server on Ubuntu:
# sudo apt-get install r-base
# sudo R -e 'install.packages(c("shiny", "rmarkdown"))'
# wget https://download3.rstudio.org/ubuntu-20.04/x86_64/shiny-server-1.5.21.1012-amd64.deb
# sudo dpkg -i shiny-server-1.5.21.1012-amd64.deb
# Deploy an app:
# sudo cp -r /path/to/myapp /srv/shiny-server/myapp
# Access at: http://your-server:3838/myapp
# Config file: /etc/shiny-server/shiny-server.conf
cat('Shiny Server config controls ports, auth, and app paths')Docker con rocker/shiny
La imagen de Docker rocker/shiny proporciona un Shiny Server preconfigurado. Monte el directorio de su aplicación en el contenedor para servirla inmediatamente. Docker garantiza la reproducibilidad: la misma imagen se ejecuta de forma idéntica en cualquier host.
# Dockerfile for a custom Shiny app
# FROM rocker/shiny:4.4.0
#
# # Install R package dependencies
# RUN R -e 'install.packages(c("ggplot2","dplyr","DT"))'
#
# # Copy app files
# COPY myapp/ /srv/shiny-server/myapp/
#
# EXPOSE 3838
# Build and run:
# docker build -t my-shiny-app .
# docker run -p 3838:3838 my-shiny-app
# Access at: http://localhost:3838/myapprenv para dependencias reproducibles
renv crea una biblioteca de paquetes a nivel de proyecto con un archivo de bloqueo (renv.lock) que registra las versiones exactas de los paquetes. Al realizar la implementación, este archivo garantiza que el servidor o la imagen de Docker instale exactamente las mismas versiones de los paquetes que se utilizaron durante el desarrollo.
library(renv)
# Initialise renv in the project (creates renv.lock)
renv::init()
# After installing/updating packages, record the state
renv::snapshot()
# On the server: restore exact versions from lockfile
renv::restore()
# Check lockfile for a specific package version
renv::dependencies() # lists all used packagesVariables de entorno para la configuración
Nunca incluya directamente en el código de la aplicación claves de API, contraseñas de bases de datos ni configuraciones específicas del entorno. Use variables de entorno, que puede leer con Sys.getenv('VAR_NAME', unset = NA). Defínalas localmente en .Renviron y, en producción, en la configuración del entorno de la plataforma de alojamiento.
# In .Renviron (never commit this file):
# DB_HOST=prod-db.example.com
# DB_PASSWORD=secret123
# API_KEY=key_abc
# In app.R:
db_host <- Sys.getenv('DB_HOST', unset = 'localhost')
db_pass <- Sys.getenv('DB_PASSWORD', unset = '')
api_key <- Sys.getenv('API_KEY', unset = '')
if (api_key == '') {
warning('API_KEY not set — some features disabled')
}Descripción general de Posit Connect
Posit Connect es la plataforma empresarial para implementar aplicaciones Shiny, documentos R Markdown, API de Plumber y mucho más. Admite:
- Inicio de sesión único (SSO) mediante LDAP o SAML
- Ejecución programada de informes R Markdown
- Control de acceso a nivel de aplicación
- Escalado automático y balanceo de carga
La implementación utiliza el mismo flujo de trabajo rsconnect::deployApp() que shinyapps.io.
library(rsconnect)
# Configure connection to Posit Connect server
rsconnect::addServer(
url = 'https://connect.yourcompany.com',
name = 'my_connect_server'
)
# Authenticate with API key
rsconnect::connectApiUser(
account = 'jsmith',
server = 'my_connect_server',
apiKey = Sys.getenv('CONNECT_API_KEY')
)
# Deploy
rsconnect::deployApp(server = 'my_connect_server')Lista de comprobación previa a la implementación
Antes de implementar una aplicación Shiny en producción, verifique lo siguiente:
- Todas las rutas de archivos utilizan rutas relativas, no absolutas.
- Los datos confidenciales (claves de API y contraseñas) se leen de variables de entorno.
- Las dependencias de paquetes se declaran explícitamente con
library()orenv.lock. - Los archivos de datos grandes se cargan una sola vez al principio de server.R (no dentro de reactive).
- Los mensajes de error no exponen información interna a los usuarios finales.
# Production-hardened app.R patterns
# Load data once at startup (not per-session)
app_data <- readRDS('data/processed.rds') # outside server()
server <- function(input, output, session) {
# Reference app_data directly — already in memory
output$plot <- renderPlot({
subset_data <- app_data[app_data$group == input$grp, ]
plot(subset_data$x, subset_data$y)
})
# Sanitise error messages
tryCatch({
risky_operation()
}, error = function(e) {
showNotification('An error occurred.', type = 'error')
# log the real error internally, not to user
message('Error: ', conditionMessage(e))
})
}Consideraciones sobre el escalado
Las aplicaciones Shiny se basan en sesiones: cada usuario obtiene su propio proceso de R (o worker). Estrategias de escalado:
- Cargue datos precalculados al iniciar la aplicación en lugar de calcularlos en cada sesión.
- Use caché reactiva con
bindCache()para realizar cálculos costosos que se compartan entre sesiones. - Múltiples workers: Shiny Server Pro y Posit Connect inician procesos de R en paralelo.
- Backends de bases de datos: use DBI/pool para acceder simultáneamente a la base de datos.
library(shiny)
library(pool)
# Create a database connection pool at startup
# (shared across all sessions)
pool <- dbPool(
drv = RPostgres::Postgres(),
host = Sys.getenv('DB_HOST'),
dbname = 'analytics',
user = Sys.getenv('DB_USER'),
password = Sys.getenv('DB_PASSWORD'),
minSize = 2,
maxSize = 10
)
onStop(function() { poolClose(pool) })
server <- function(input, output, session) {
output$tbl <- renderTable({
dbGetQuery(pool, 'SELECT * FROM metrics LIMIT 100')
})
}Comprobación rápida
¿Cuál es la forma recomendada de gestionar las claves de API y las contraseñas de bases de datos en una aplicación Shiny implementada?
Resumen de la implementación de aplicaciones Shiny
Conclusiones clave sobre la implementación de aplicaciones Shiny:
- Opciones de implementación: shinyapps.io (la más sencilla), Shiny Server (autohospedado), Posit Connect (empresarial) y Docker.
- app.R debe declarar todas las dependencias con
library(); userenv::snapshot()para reproducir las versiones. rsconnect::deployApp()agrupa y envía la aplicación a shinyapps.io o Posit Connect.- Docker con
rocker/shinyproporciona la máxima portabilidad. - Use
Sys.getenv()para las credenciales; nunca incluya secretos directamente en el código. - Cargue los conjuntos de datos grandes al iniciar la aplicación (fuera de
server()) para compartirlos entre sesiones. - Use pools de conexiones (paquete
pool) para acceder simultáneamente a la base de datos.
# Minimal production-ready structure
# myapp/
# app.R <- ui + server + shinyApp()
# data/ <- processed datasets
# R/ <- modules and helpers
# renv.lock <- package version snapshot
# .Renviron <- local env vars (gitignored)
# Deploy:
library(rsconnect)
rsconnect::deployApp(
appDir = 'myapp',
appName = 'my_production_app'
)Preguntas frecuentes
¿La lección «Implementación de aplicaciones Shiny» es gratis?
Sí — el texto completo de «Implementación de aplicaciones Shiny» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Implementación de aplicaciones Shiny»?
Publique aplicaciones en shinyapps.io, Shiny Server y entornos con Docker. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar R Academy?
No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Implementación de aplicaciones Shiny»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de R Academy?
Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Profundización en la programación reactiva
- Módulos de Shiny para reutilizar código
- Interfaz de usuario dinámica con renderUI e insertUI
- Implementación de aplicaciones Shiny