5  Paquetes, rmarkdown y shiny

Esta sección comienza con una discusión sobre los paquetes, que son extensiones de R. Luego nos centraremos en dos de ellos: shiny y rmarkdown. El primero de ellos permite crear cuadros de mando interactivos. El segundo, documentos automatizados que combinan texto con código, tablas y gráficos generados directamente por R.

Estos dos paquetes no son complejos sino, más bien, extensos y llenos de detalles. El objetivo de este breve capítulo no es, por supuesto, recorrer exhaustivamente todas sus opciones y posibilidades. Más bien, proporcionar al lector una base sobre la que poder completarlos todos por sí mismo cuando así lo exija una aplicación concreta.

5.1 Paquetes

R tiene paquetes (unos cuantos miles en la actualidad) que extienden sus funciones básicas. Al abrir R se cargan automáticamente una serie de paquetes básicos, como por ejemplo, base, donde están casi todas las funciones que hemos usado hasta el momento, o stats, que contiene las funciones lm o glm usadas previamente1.

La lista completa de los paquetes oficiales puede consultarse en CRAN2. Además de los oficiales, existen paquetes que pueden instalarse desde lugares como, por ejemplo, Github.

No es sencillo encontrar el paquete que puede ser útil para un determinado fin. Las vistas de CRAN, descripciones de paquetes usados en un determinado ámbito y mantenidas por un experto en la materia, pueden ser un buen punto de partida.

La instalación de paquetes (en este caso, los dos que usaremos en esta sección) puede realizarse o bien desde la consola,

install.packages("shiny")

o bien a través de los menús de RStudio (bajo Tools). Una vez instalados los paquetes es necesario cargarlos para que las funciones que contienen estén disponibles en la sesión:

library(shiny)

Ejercicio 5.1 Encuentra un paquete de R para acceder a datos de Google Analytics e instálalo. Nota: existen varios.

Muchos paquetes tienen viñetas, que son documentos que explican cómo usar el paquete. A diferencia de la ayuda de las funciones, que están pensadas para describir todos sus detalles de su uso, incluidos los más arcanos, las viñetas se parecen más a una guía de usuario: suelen indican cómo utilizar las funciones del paquete y sus opciones más comunes para resolver algún caso sencillo. Leer las viñetas, cuando existen, es la mejor manera de familiarizarse con el funcionamiento de un paquete.

Ejercicio 5.2 Si tienes una cuenta en Google Analytics, sigue estas instrucciones para descargar datos de ese servicio y procesar los datos obtenidos.

5.2 Rmarkdown

Rmarkdown permite la creación de informes estáticos que combinan texto con código y resultados, gráficos incluídos, generados con R. Aprender Rmarkdown implica aprender dos cosas distintas:

  • Markdown, un formato para escribir documentos simples en modo texto. Tiene la ventaja de ser fácilmente legible por humanos pero, a la vez, procesable programáticamente para volcarlos en otros formatos: pdf, html, etc.
  • La integración entre R y markdown.

Para aprender markdown, una tarea que no debería durar más de 10-15 minutos, se recomiendam los dos siguientes ejercicios.

Ejercicio 5.3 Crea un fichero .Rmd usando File > New File > R Markdown.

Al crear un nuevo fichero de tipo R Markdown, RStudio proporciona, en lugar de uno vacío, una plantilla que muestra algunas de las opciones disponibles en este formato. Eso facilita el siguiente ejercicio:

Ejercicio 5.4 Aprende markdown modificando el fichero de ejemplo creado en el ejercicio anterior añadiéndole títulos de varios niveles, párrafos de texto, cursivas, negritas, enlaces, listas (numeradas y sin numerar), etc. usando como guía el tutorial http://commonmark.org/help/. Recuerda compilar el documento (p.e., pulsando el botón con la etiqueta Knit HTML situado encima del panel de edición de RStudio) para inspeccionar el resultado final.

Tambiénse pueden generar documentos en formato Word y PDF. Para estos tendrás que tener instalados los programas necesarios: MS Word, LibreOffice o similar para el primero y LaTeX para el segundo.

Para generar el documento en, por ejemplo, formato Word, despliega el menú debajo del icono Knit de RStudio y selecciona la opción Knit to Word.

No es necesario utilizar los menús para compilar el fichero de salida. Es posible hacerlo programáticamente.

El segundo de los componentes de Rmarkdown (y lo que lo diferencia de Markdown a secas) es la posibilidad de incorporar bloques de código en el hilo del documento. Estos bloques de código se procesan durante la compilación y los resultados que generan (tablas, gráficos, etc.) se integran en la salida. La plantilla de fichero Rmarkdown que genera RStudio incluye unos cuantos bloques de código de ejemplo.

Ejercicio 5.5 Crea sobre tu documento (o sobre una nueva plantilla) nuevos bloques de código que hagan alguna cosa.

Ejercicio 5.6 Los bloques de código incluyen opciones en su encabezamiento (p.e., para que un bloque se ejecute o no; para que el código se muestre o se oculte en el documento final, etc.). Consulta las opciones (y el tipo de opciones) disponibles en la página de documentación de Knitr.

Con Rmarkdown y sus extensiones se han escrito informes, artículos e, incluso, libros completos. Una de las grandes ventajas de integrar el texto y el código es que todo el proceso de generación del documento final es automático, sin necesidad de incorporar manualmente gráficos o tablas procedentes de terceros programas. Una consecuencia de creciente interés de la automatización del proceso es que evita los errores humanos (o cierto tipo de ellos) en la manipulación de datos. El documento, al contener el código, es en sí mismo la traza de las manipulaciones realizadas y un tercero, en caso de duda, puede reproducir3 el análisis completamente. O incluso aplicarlo a conjuntos de datos distintos.

Los autores originales de RMarkdown han creado un reemplazo, quarto, que lo extiende en varios sentidos. El principal de ellos es que permite integrar código en lenguajes distintos a R, como Python o Julia. Tiene pequeños cambios de sintaxis con respecto a Rmarkdown pero, en esencia, es lo mismo.

5.3 Shiny

shiny es un paquete de R para la construcción de cuadros de mando web interactivos. Permite, por ejemplo, crear interfaces para algoritmos o acceder y manipular tablas de datos a través de controles de HMTL: sliders, botones, etc.

El paquete proporciona varias aplicaciones de ejemplo que usaremos para aprender los rudimentos de shiny. Por ejemplo, se puede hacer

library(shiny)
runExample(example = "01_hello")

para desplegar la aplicación de ejemplo 01_hello. Esta aplicación pinta en el panel central un histograma y tiene en el lateral un slider con el que modular su granularidad (técnicamente, para definir el número de pedazos, breaks, en los que partir el rango de valores del vector subyacente).

Para detener la aplicación, en RStudio, presiona sobre el icono de la señal de stop (en la parte superior de la ventana de la consola); en una terminal, usa Control-C para interrumpir la ejecución.

Ejercicio 5.7 Ejecuta runExample() (sin argumento); el mensaje de error indica qué otros ejemplos además de 01_hello están disponibles por defecto. Échales un vistazo a algunos.

Ejercicio 5.8 Crea tu primera aplicación en shiny. Para ello, despliega 01_hello como antes. Las aplicaciones de ejemplo incluyen su código, del que nos apropiaremos para desarrollar nuestra propia aplicación. Así que crea el fichero app.R y copia en él el contenido tal como se muestra en la aplicación. Guárdalo en un nuevo directorio vacío al que puedes llamar, por ejemplo, prueba00: recuerda, el nombre de tu aplicación será el nombre que des al directorio que la contiene. Finalmente, ejecuta runApp("prueba00") para desplegarla.

El ejercicio anterior muestra cómo construir aplicaciones en shiny. Una aplicación en shiny es un directorio que da nombre a la aplicación. Dentro de él tiene que haber, como mínimo, un fichero, app.R, que contiene dos bloques en que se definen los componentes ui y server. El primero define la interfaz de la aplicación. El segundo realiza los cálculos en segundo plano cada vez que el usuario manipula los controles de la interfaz.

Ejercicio 5.9 Compara el contenido de los bloques ui y server definidos en app.R y trata de relacionar los elementos qeu se definen en ellos con el resultado visual y funcional de la aplicación.

En versiones anteriores de shiny era obligatorio disponer los componentes ui y server en dos ficheros independientes, ui.R y server.R. Actualmente, es potestativo.

Además de este fichero, en aplicaciones más complejas, puede haber otros organizados o no en subdirectorios: datos, otros ficheros auxiliares de código, logos, CSSs, imágenes estáticas, etc. Tendrás que leer la documentación de shiny para averiguar cómo y dónde colocar estos recursos adicionales si es que los necesitas.

Los dos ejercicios siguientes, opcionales, bastante avanzados y que tienen más que ver con la administración de sistemas Linux que con R, muestran cómo una aplicación desarrollada en shiny puede ser puesta en producción y distribuida a los usuarios a través de la web.

Ejercicio 5.10 Instala Shiny Server (busca en internet la página de descarga de esa aplicación) en tu máquina Linux. Guarda tu fichero app.R en el directorio adecuado y accede a tu aplicación a través de tu navegador (puerto 3737, por defecto). Nota: existen tutoriales bastante detallados sobre cómo hacer esto.

Ejercicio 5.11 Como continuación del ejercicio anterior, da salida a shiny a través del puerto 80 vía Apache u otros.

Los bloques ui y server se comunican entre sí: ui tiene que pasarle parámetros a server y este resultados a aquel. Esto se hace a través de variables y estructuras de datos con una forma muy particular. El siguiente ejercicio está pensado para que descubras el mecanismo de comunicación. Se te va a pedir que traduzcas el nombre de las variables y los parámetros al español. Obviamente, al traducir las variables en uno de los bloques se romperá la aplicación. Realinear los nombres en el otro bloque te servirá para identificar los mecanismos de comunicación.

Ejercicio 5.12 Crea prueba01 como una copia de prueba00. Entonces, traduce al español el nombre de todas las variables implicadas en la aplicación.

El siguiente ejercicio te enseñará a modificar la interfaz de una aplicación en shiny, incorporar nuevos controles y añadir el código subyacente para que responda adecuadamente.

Ejercicio 5.13 Añade a la aplicación prueba01 otro slider que mueva una linea vertical roja que dibujes sobre el histograma. Es recomendable que comiences, y en este orden, añadiendo una línea roja en algún punto (del eje x) prefijado con la función abline, incorporando el slider y finalmente, vinculando el valor proporcionado por el slider al punto del eje x.

Nota: cuando modifiques ui, presta atención a la estructura del programa y cómo se corresponde a la de la interfaz web: qué es lo que va en la barra lateral, qué en el panel central, etc. Ten cuidado además con los paréntesis: ¡hay muchos y es fácil desemparejarlos!

Ejercicio 5.14 Inspecciona el tutorial de shiny para descubrir qué tipo widgets (además de sliders) existen, cómo procesan server esos inputs, etc. Recuerda que ese tutorial es la principal fuente de información sobre todo lo relacionado con shiny.

Ejercicio 5.15 Visita la galería de aplicaciones de Shiny) para investigar cómo implementar controles, qué tipos adicionales de paneles existen, etc.

Uno de los asuntos (avanzados) que se discuten en esas páginas es el de las reacciones: shiny está basado en un tipo de programación denominada reactiva, que es la que permite que las funciones de server.r simulen estar escuchando (y reaccionen) a los cambios que realiza el usuario en los controles de la aplicación. Puedes buscar en internet más información sobre la programación reactiva si te interesa el tema.

5.4 Resumen y referencias

Los paquetes de R extienden el lenguaje. Existen, literalmente, miles de ellos, aunque varían grandemente en extensión, calidad y utilidad. Los hay muy básicos: algunos desarrolladores, por ejemplo, han usado los paquetes para publicar un único conjunto de datos (i.e., han creado un paquete que solo contiene un conjunto de datos). En el extremo opuesto, los hay con centenares de funciones. En términos de calidad, los hay de todo tipo, desde los mantenidos de manera profesional hasta los francamente inadecuados para su uso en producción.

Finalmente, coexisten paquetes que implementan métodos estadísticos pensados para un fin sumamente concreto con otros para los que muchísimos usuarios han encontrado uso. De entre los más útiles para quienes analizan datos profesionalmente se encuentran los dos discutidos más ampliamente en este capítulo: shiny y rmarkdown.

Ambos se utilizan profusamente en estos entornos y son las dos herramientas que más se utilizan (y se recomienda utilizar) para comunicar y diseminar resultados analíticos.

Desarrollar interfaces en shiny puede ser engorroso. Exste un paquete, flexdashboard, que permite definir los componentes de una aplicación de shiny directamente usando Rmarkdown, combinando así la sencillez de este último con la interactividad de Shiny. Puedes aprender más sobre flexdashboard aquí.

5.5 Ejercicios adicionales

Ejercicio 5.16 Busca dentro de las vistas de CRAN algún tema de tu interés. Échale un vistazo a los paquetes disponibles.

Ejercicio 5.17 Investiga cómo instalar paquetes directamente desde Github usando las herramientas del paquete devtools. Nota: muchos de estos paquetes no son oficiales (lo cual no es un juicio sobre su calidad); en otras ocasiones, desde Github pueden descargarse versiones más actualizadas de paquetes oficiales que las disponibles en CRAN.

Ejercicio 5.18 Investiga cómo representar tablas en documentos de Rmarkdown. Ten en cuenta que existen varias maneras, desde las más rudimentarias a otras más sofisticadas y con un acabado más profesional que utilizan paquetes auxiliares.

Ejercicio 5.19 Investiga una aplicación de ejemplo desarrollada con flexdashboard. Aprópiate de ella y trata de introducir tus propias modificaciones.

Ejercicio 5.20 Reimplementa el ejemplo 01_hello de Shiny en flexdashboard.


  1. Puedes ver, aunque no es demasiado útil, la lista de los paquetes cargados en R con la función search(); en una pestaña del panel inferior derecho de RStudio también se muestra una lista de los disponibles y los actualmente cargados en la sesión.↩︎

  2. CRAN (Comprehensive R Archve Network) es el repositorio oficial de paquetes de R, el lugar donde se publican las nuevas versiones del programa, etc. Contiene la lista completa de paquetes oficiales↩︎

  3. De hecho, Rmarkdown nació para dar respuesta a un problema acuciante en la academia y fuera de ella: que los resultados de muchos artículos e informes eran imposibles de reproducir con otros datos, en otros lugares, por otras personas.↩︎