Tutorial de introducción a las aplicaciones web Shiny

Aplicación para mostrar mapas municipales de diferentes estados sin usar código.

En este documento, veremos como hacer subset de los estados con el fin de aplicarlo en una aplicación shiny. Primero necesitamos descargar un archivo *.shp de información de los polígonos de los municipios de México (para este caso). Se recomienda bajar uno de este enlace.

Las librerías que utilizaremos serán la librería sf para el manejo de información geográfica de manera sencilla, la librería leaflet para la creación de mapas interactivos y la librería dplyr para el manejo básico de bases de datos.

# Librerías a utilizar
library(sf)
library(leaflet)
library(dplyr)

Abrimos el archivo *shp que contiene la información de los municipios.

# Abrimos el shape de municipios, que en mi caso tengo guardado en la carpeta muni_2010gw 
mun <- st_read("/muni_2012gw/Muni_2012gw.shp", quiet = T)

Caso n = 1 (hacerlo de manera estática para un caso)

Antes de hacer una aplicación interactiva, trataremos de hacer una aplicación estática para un solo caso. En este ejemplo, obtendremos un mapa de un solo estado filtrando la base de datos de los municipios para que sólo se muestren los polígonos municipales del estado 1. A continuación se muestra como hacer esto.

# Filtramos los datos para que solo salga un estado
mun_estado <- mun %>%
  filter(CVE_ENT == "01")

# Graficamos el mapa resultante
leaflet(mun_estado) %>%
  addTiles() %>%
  addPolygons()

Una vez que lo hemos hecho para el caso n = 1 = “Aguascalientes”, ahora haremos una aplicación web que nos permita, desde el usuario, el poder seleccionar que estado queremos que se grafique.

ShinyApp

Ahora generaremos una ShinyApp en la que le daremos un control de seleccion y trazaremos un mapa en base al estado seleccionado. Igualmente habrá un texto que de manera dinámica nos este mostrando el índice del estado que estamos seleccionando.

Para eso, primeramente haremos una lista a la que llamaremos opciones. Esta lista será la encargada de dar las opciones al selector que vamos a programar.

# Creamos una lista con el nombre de los estados y su numero indice:
opciones <- c(
  "Aguascalientes"  = "01",
  "Baja California" = "02",
  "Baja California Sur"   = "03",
  "Campeche"            = "04",
  "Coahuila"              = "05",   
  "Colima"                  = "06",
  "Chiapas"               = "07",   
  "Chihuahua"           = "08",
  "Ciudad de México"= "09",
  "Durango"             = "10",
  "Guanajuato"          = "11",
  "Guerrero"                = "12",
  "Hidalgo"                 = "13",
  "Jalisco"                 = "14", 
  "EdoMex"                  = "15",
  "Michoacán"           = "16",
  "Morelos"                 = "17",
  "Nayarit"                 = "18",
  "Nuevo León"          = "19",
  "Oaxaca"                  = "20",
  "Puebla"                  = "21",
  "Querétaro"           = "22",
  "Quintana Roo"    = "23",
  "San Luis Potosí" = "24",
  "Sinaloa"                 = "25",
  "Sonora"                  = "26",
  "Tabasco"                 = "27",
  "Tamaulipas"      = "28",
  "Tlaxcala"                = "29",
  "Veracruz"                = "30",
  "Yucatán"             = "31",
  "Zacatecas"               = "32"  )   

Una vez que tenemos esta lista de opciones, procederemos a realizar la aplicación Shiny,

Una aplicación Shiny tiene tres elementos:

  • el global, que es donde cargamos nuestras librerías, las bases de datos y las funciones que vamos a utilizar en la aplicación,

  • la UI, que es la interfaz de usuario y es donde programamos los elementos con los cuales interactúa el usuario, como selectores, botones, cajas, controles y gráficas y mapas, y

  • el server, que es la parte del código que se encarga de programar el funcionamiento de todos esos controles y de programar el contenido, la forma y el estilo de las gráficas, tablas, mapas y demás elementos de visualización.

Al final, estos tres elementos se integran en la función shinyApp(ui, server) para desplegar la aplicación web shiny. Dentro de RStudio, esta aplicación se puede desplegar en una ventana independiente, en el viewer o en un navegador aparte (browser). Esta aplicación web se sube a un servidor especial de RStudio para su publicación.

A continuación se muestran estos tres elementos en el código de una aplicación.

# UI: Generamos la interfaz de usuario 
ui <- fluidPage(
  selectInput(inputId = "selESTADO", label = "Seleccione estado",
              choices = opciones), 
  textOutput("data"), 
  leafletOutput("leaflet")
)

# Funcion Server (el funcionamiento del programa)
server <- function(input, output){
  output$data <- renderText({
    print(paste0("Número de estado: ",input$selESTADO ))
  })
  
  # Rendereamos el texto
  output$leaflet <- renderLeaflet({
    mun_estado <- mun %>%
      filter(CVE_ENT == input$selESTADO)
    
    # Graficamos el mapa resultante
    leaflet(mun_estado) %>%
      addTiles() %>%
      addPolygons()
  })
  
}

# Corremos la aplicacion web
shinyApp(ui, server)

En esta primera figura, se puede ver la aplicación web.

Aquí, seleccionamos del controlador un estado diferente (en este caso, “Sonora”).

Y finalmente se ve como se grafica el estado de “Sonora” con todos sus municipios.

Esta es una primera introducción a lo más básico de Shiny. Esta página web no es interactiva, debido a que para que esto suceda debe estar alojada en los servidores especiales de RStudio, sin embargo, si se copia el código de este archivo y se descarga la base de datos de los municipios y las librerías que aquí se mencionan, puede ejecutarse de manera dinámica en RStudio sin mayor problema.

Si se quiere continuar en el aprendizaje de este tipo de aplicaciones, se recomienda checar temas de reactividad, para poder hacer que los elementos del UI interactúen entre sí a través de eventos reactivos, la librería de shinydashbard, la cual nos permite generar tableros de manera más profesional, entre otros temas. Igualmente, se sugiere el estudio de las gráficas en ggplot2 y su conversión a gráficas interactivas mediante la libreria plotly, y revisar las capacidades del grupo de librerías denominado htmlwidgets. Al menos como primer acercamiento.