Visualización interactiva con R Shiny App

por | Nov 25, 2019

R Shiny App es un paquete de R destinado al desarrollo de aplicaciones interactivas de visualización de datos. Permite la instalación de una aplicación web corriendo en R en un servidor, y que podremos personalizar de forma sencilla con sintaxis HTML, CSS o Javascript.

Instalación de R Shiny App

En esta publicación damos por hecho que tenemos R instalado. Si este no es tu caso, te recomendamos que eches un vistazo a nuestra publicación Bienvenida a R Studio. El primer paso será abrir R Studio e instalar R Shiny con el siguiente comando en la terminal.

install.packages("shiny")

R descargará la última versión de R Shiny y la instalará. Al acabar el proceso deberíamos ver en pantalla:

"package ‘shiny’ successfully unpacked and MD5 sums checked"

Para comprobar que Shiny se ha instalado correctamente, escribimos en la terminal de R y ejecutamos:

library(shiny)

Esto debería ejecutarse sin ningún error. Puede ser que dependiendo de nuestra versión de R, nos advierta de que la versión de R Shiny ha sido escrita en una versión de R superior, pero esto no debería causar ningún problema, sólo es un warning que nos devolverá la terminal de R.

Estructura de una R Shiny App

Toda aplicación R Shiny App se ejecuta en un ordenador (al que llamamos “servidor”) con R instalado. La estructura de cualquier aplicación se divide en dos funciones principales:

  • UI
  • Server

La función UI se encarga de crear la interfaz visual de nuestra aplicación. Un ejemplo sería la función fluidPage():

ui <- fluidPage()

Por último, una función ejecuta tanto _ui_ como server, y nos muestra el resultado.

shinyApp(ui, server)

Podemos esquematizar el comportamiento de la aplicación tal y como vemos en el siguiente diagrama:

R Shinny App

Primera aplicación Shiny

Vamos a ver un ejemplo de una sencilla aplicación Shiny. Creamos un archivo llamado shiny.R y empezamos a crear nuestras tres funciones:

  1. ui
  2. server
  3. shinyApp

ui

Nuestra función ui quedaría de la siguiente forma:

#Definimos la interfaz para mostrar un histograma de ejemplo
ui <- fluidPage(

  #Creamos el título de la aplicación
  titlePanel("Histograma"),

  #Plantilla que incluye un panel lateral y un panel central más grande
  sidebarLayout(

    #Panel lateral dónde tendremos un deslizador
    sidebarPanel(

      #Deslizador que nos permitirá variar el número de cajas del histograma
      #min y max nos delimita los valores minimos y máximos del delizador, y value el valor por defecto
      sliderInput(inputId = "bins",
                  label = "Número de cajas:",
                  min = 3,
                  max = 15,
                  value = 3)

    ),

    #Panel central para mostrar el histograma
    mainPanel(

      #Visualización a mostrar, en este caso un histograma
      plotOutput(outputId = "distPlot")

    )
  )
)

En la variable ui no tenemos más que código HTML, cómo podemos ver si escribimos ui en la terminal de R.

R Shinny UI

Este código HTML será la plantilla que use nuestra aplicación junto con la función server para renderizar la visualización en tiempo real.

Server

La función server debe crear y mantener actualizado un histograma. Por ello, debemos darle los datos a incluir en el gráfico, crear el histograma y todo ello, dárselo a la función server como output.

#Creamos un vector aleatorio de 1000 elementos fuera de la función server
#para que no se recalcule de nuevo cada vez que cambiamos el valor con el deslizador
times <- rpois(n = 1000, lambda = 5)

#Función que renderiza el histograma de forma dinámica
server <- function(input, output) {
  #Renderizamos en tiempo real el histograma "distPlot"
  output$distPlot <- renderPlot({

    #Creamos las variables que pasaremos al histograma. Valores x e intervalos
    x    <- times
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    #Pasamos las variables al histograma, le damos nombre a los ejes y formato en color
    hist(x, breaks = bins, col = "#153B74", border = "white",
         xlab = "Tiempo de espera en pista de despegue (minutos)",
         ylab = "Número de aviones",
         main = "Número de retrasos en despegue")

  })

}

ShiniApp

Por último introducimos a la función shiniApp las variables ui y server. El código entero, quedaría tal y como sigue. Atención a importar la librería shiny al principio del script.

#Importamos la librería shiny
library(shiny)

#Definimos la interfaz para mostrar un histograma de ejemplo
ui <- fluidPage(

  #Creamos el título de la aplicación
  titlePanel("Histograma"),

  #Plantilla que incluye un panel lateral y un panel central más grande
  sidebarLayout(

    #Panel lateral dónde tendremos un deslizador
    sidebarPanel(

      #Deslizador que nos permitirá variar el número de cajas del histograma
      #min y max nos delimita los valores minimos y máximos del delizador, y value el valor por defecto
      sliderInput(inputId = "bins",
                  label = "Número de cajas:",
                  min = 3,
                  max = 15,
                  value = 3)

    ),

    #Panel central para mostrar el histograma
    mainPanel(

      #Visualización a mostrar, en este caso un histograma
      plotOutput(outputId = "distPlot")

    )
  )
)

#Creamos un vector aleatorio de 1000 elementos fuera de la funcion server
#para que no se recalcule de nuevo cada vez que cambiamos el valor con el deslizador
times <- rpois(n = 1000, lambda = 5)

#Función que renderiza el histograma de forma dinámica
server <- function(input, output) {
  #Renderizamos en tiempo real el histograma "distPlot"
  output$distPlot <- renderPlot({

    #Creamos las variables que pasaremos al histograma. Valores x e intervalos
    x    <- times
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    #Pasamos las variables al histograma, le damos nombre a los ejes y formato en color
    hist(x, breaks = bins, col = "#153B74", border = "white",
         xlab = "Tiempo de espera en pista de despegue (minutos)",
         ylab = "Número de aviones",
         main = "Número de retrasos en despegue")

  })

}
#Arrancamos la aplicación pasando a shinyApp, ui y server
shinyApp(ui=ui, server=server)

Si todo ha ido bien, deberíamos ver en RStudio la visualización en la pestaña viewer.

R Studio R Shiny

Si queremos ver nuestro dashboard en el navegador web, debemos pulsar en el botón show in new window.

Próximos pasos a tomar

Más adelante veremos aplicaciones más avanzadas de R Shiny, dónde además limpiaremos y analizaremos los datos, enfocándonos en casos de uso reales.

Si te quieres dominar la visualización en R Shiny, en Nebulova tenemos un curso avanzado dónde aprenderás todo necesario para poder crear desde cero aplicaciones alojadas en servidor listas para el cliente final.

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *