Mi camino en R comenzó hace relativamente muy poco, pero desde el principio supe que queria meterme de lleno en el desarrollo de aplicaciones web combinando mi pasion por el lenguaje HTML, CSS y Javascript.
Asi es que, luego de realizar un curso intensivo en R, aproveché el trabajo final para empezar a meterme en el maravilloso mundo de Shiny.
Lo primero con lo que me encontre es que hay muchos articulos y muy variados sobre como publicar una ShinyApp por primera vez, pero esta informacion esta muy dispersa y para los/as que recien empezamos resulta un tanto confuso.
Por esta razon es que armo esta guia, donde voy a tratar de ordenar la informacion que fui recabando y los desafios con los que me encontre en mi experiencia personal.
Mi primera recomendación es configurar el espacio de trabajo. Esto es, dejar todo listo para la publicacion de la app una vez que estemos satisfechos con nuestro trabajo. Doy por descontado que estamos trabajando con RStudio y su fantastico ecosistema.
Para esto, nos vamos a hacer una cuenta en shinyapps.io. Hay varios tipos de cuenta, con distintos objetivos y con sus precios correspondientes. Como siempre, la gente de RStudio ofrece una opcion gratuita con las caracteristicas suficientes para comenzar a probar.
El plan gratuito incluye 5 aplicaciones alojadas y hasta 25 horas de actividad mensuales (la app permanece idle hasta algun acceso). Esto ultimo es muy importante a la hora de subir la version final de nuestra aplicacion, ya que las horas se contabilizan por ciclo mensual y cuando se alcanza el limite en la cuenta gratuita deja de estar disponible para el acceso publico hasta el proximo ciclo.
Para nuestras primeras aplicaciones, suponiento que no apuntamos a ambientes productivos, vamos a estar bien.
Por otro lado, si creemos que vamos a tener una gran afluencia de visitantes y no podemos invertir en una cuenta paga, una alternativa es generar una estructura de varias apps vinculadas entre si. Este concepto no lo experimente por mi mismo, pero conozco experiencias que lo llevaron adelante. Por supuesto, los tiempos de carga pueden resultar negativos en la experiencia de navegacion.
Otra alternativa, que requiere conocimientos bastante mas avanzados, es generar nuestro propio servidor usando Shiny Server o ShinyProxy
Una vez que tenemos una cuenta en Shinyapps tenemos que vincularla con el IDE.
Para esto, el primer requisito es generar un token para autorizar la conexion. Esto lo hacemos desde TOKENS en nuestra cuenta de shinyapps.io:
Con esta info, nos vamos a Rstudio y desde Tools > Global Options > Publishing hacemos click en Connect.
Esto nos abre el dialogo para conectar nuestra cuenta de shinyapps con el string de conexion (token + secret) en pasos anteriores.
Listo! Nuestra cuenta ya se encuentra vinculada al IDE. Esto nos va a permitir publicar la app directamente desde Rstudio con suma facilidad y con bastante control.
Es de extrema importancia iniciar el proceso de creacion de una aplicacion lo mas ordenado posible. Sobre todo para no tener que realizar cambios en la estructura principal.
Para esto, una best practice es crear un proyecto en RStudio por cada aplicacion.
Para esto vamos a File > New Project donde podemos optar por crear un directorio para la app o alguno ya creado.
Luego seleccionamos Shiny Web Application como tipo de proyecto y elegimos el nombre del directorio y, ademas, tenemos la posibilidad de crear un repositorio de git (en proximos articulos voy a contar un poco mas sobre esto).
Esto nos genera un directorio nuevo con 2 archivos, app.R: el archivo unificado de la aplicacion y test.Rproj: el archivo del proyecto.
Como acabamos de ver, cuando creamos una nueva Shiny Web App como proyecto nos deja un workspace de un solo archivo para la aplicacion.
Pero, si lo hacemos de manera independiente, desde File > New File > Shiny Web App nos permite elegir la estructura inicial de la aplicacion:
Esta estructura es ideal para aplicaciones pequeñas, concentra en un mismo archivo las funciones de server y de interface.
Ver código
#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Old Faithful Geyser Data"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30)
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot")
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
output$distPlot <- renderPlot({
# generate bins based on input$bins from ui.R
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
# draw the histogram with the specified number of bins
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})
}
# Run the application
shinyApp(ui = ui, server = server)
En mi opinion, es la estructura indicada para aplicaciones medianas o grandes, principalmente a medida que aumenta el numero de lineas de codigo. Dividir la aplicación en varios archivos nos permite tener mayor visibilidad sobre el codigo, ayuda en el proceso de debugging y permite reutilizar el código para otro proyecto.
Ver código
#
# This is the user-interface definition of a Shiny web application. You can
# run the application by clicking 'Run App' above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
# Define UI for application that draws a histogram
shinyUI(fluidPage(
# Application title
titlePanel("Old Faithful Geyser Data"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30)
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot")
)
)
))
Ver código
#
# This is the server logic of a Shiny web application. You can run the
# application by clicking 'Run App' above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
# Define server logic required to draw a histogram
shinyServer(function(input, output) {
output$distPlot <- renderPlot({
# generate bins based on input$bins from ui.R
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
# draw the histogram with the specified number of bins
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})
})
Es una muy buena practica centralizar bloques de codigo o lógicas que puedan ser reusadas y evitar lineas redundantes. Para esto, podemos crear un script llamado global.R en el directorio raiz de la app.
Este script se ejecuta una sola vez, al lanzar la aplicacion. Pero lo mas importante es que cualquier objeto que se genere aqui queda disponible automaticamente tanto para app.R como para ui.R y server.R.
No es un requerimiento de una Shinyapp contar con esto, pero con este script podemos realizar mucho del pre-procesamiento y aumentar la velocidad de la app al reusar logicas o variables, en un ambiente global.
Es un excelente lugar para:
Recomiendo crear un directorio /dataen la raiz para ubicar nuestros datasets, archivos de datos .Rdata o archivos HTML . Estos datos los podemos cargar en global.R con, por ejemplo, load(file = “./data/XXXX.RData”) y ya queda disponible para toda la sesion :)
Tambien, podemos generar la carpeta /wwwpara incorporar nuestros archivos CSS o imagenes, por ejemplo.
Entonces, un ejemplo de una buena estructura para la publicacion, nos debería quedar asi:
.
└── test_app/
├── ui.R
├── server.R
├── data/
│ ├── dataframe.Rdata
│ └── data_raw.csv
└── www/
├── A.jpg
└── ui.css
Bien, con todo lo anterior ya estamos en condiciones de publicar nuestra app de manera publica en internet.
Si hicimos todos los pasos anteriores vamos a poder subir la app directamente desde RStudio. Desde File > Publish o por el boton en el área de trabajo accedemos al dialogo de publicacion:
Una vez que le damos al boton Publish vamos a ver que se abre un job en nuestra consola donde podemos ir viendo el proceso de deployment. Si todo salio bien, tenemos que ver en esta pestaña un mensaje que dice Deployment completed y una URL. Mediante esa URL (que seguramente ya se abrio automaticamente en nuestro navegador) ya podemos acceder a nuestra app 😃💪
Una vez que publicamos nuestra app, podemos acceder desde nuestro dashboard a distintos controles y configuraciones.
Las secciones del dashboard son bastante self explanatory, pero en mi opinion no hay que perder de vista las siguientes:
En Overview podemos ver un resumen de los datos de la app como Id, status o la URL de acceso. Tambien tenemos un grafico del uso de la aplicacion en horas, que nos puede dar una idea cuan cerca o no esamos del limite mensual.
Desde Metrics tenemos acceso a la informacion a nivel infraestructura del consumo de la aplicacion, como por ejemplo cantidad de conexiones, la memoria RAM utilizada o uso de CPU.
En Logs podemos obtener un log practicamente realtime de la ejecucion de nuestra app. Es muy importante familizarizarsse con este aspecto, para poder realizar un troubleshooting en caso de algun error.
Para cerrar esta publicacion, comparto algunos links con recursos que me resultaron muy valiosos en estos primeros pasos con Shiny:
Una publicacion de Santiago Lator
santiago.lator@gmail.com