Capítulo 18 Contando los datos: rmarkdown

Si se tuvieran que destacar una lista fortalezas de R frente a Python, creo que dos estarían en los primeros puestos. La primera sería las opciones de visualización y procesamiento de datos (y su sencillez). Y la segunda, para mí, es sin duda sus opciones para generar informes, incluso libros, webs, apuntes y hasta diapositivas (tienes algunos de los paquetes en la lista de recursos). Y la base de todos ellos es el paquete rmarkdown.

install.packages("rmarkdown")

¿Cuál es la ventaja de generarlos desde rmarkdown?

La más obvia es que, al hacerlo desde RStudio, puedes generar un informe o una presentación de unos datos sin salirte del entorno de programación en el que estás trabajando: analizar los datos, resumirlos y comunicarlos desde el mismo entorno de trabajo. La segunda ventaja es que nos va a permitir integrar fácilmente código R, de forma que no solo podremos integrar las salidas de nuestro trabajo sino también el código con el que lo hemos generado.

18.1 ¿Qué es R Markdown?

De forma resumida, R Markdown es una herramienta que nos permite crear de forma sencilla documentos (este manual que estás leyendo está generado integramente con dicha herramienta) combinando:

  • Markdown: creado en 2004 por John Gruber, y de uso libro, es un «lenguaje» que nos permite crear contenido de una manera sencilla de escribir, y que en todo momento mantenga un diseño legible, permitiendo la inclusión sencilla de párrafos, negritas, cursivas, etc, con algunas de las ventajas de un HTML pero sin necesidad de saber programar en él. Si acostumbras a escribir en wordpress, blogs u otras plataformas, seguramente hayas escrito de esta forma (sin saberlo quizás).
  • Latex: herramienta (lenguaje en realidad) para escribir notación matemática como \(x^2\) o \(\sqrt{x}\). Si escribes notación similar en editores de texto, seguramente sin saberlo estés usando ya latex. Esto nos permitirá profundizar aún más en el contenido que mostremos.
  • Código y salidas de R: podremos no solo mostrar el paso final sino el código que has ido realizando, con cajitas de código como has podido ir comprobando a lo largo de este manual.
  • Imágenes
  • Estilos (css, js, etc)

Y lo mejor: todo esto se podrá hacer solo con código R y algún extra a tener en cuenta, produciendo material reproducible por el resto de la comunidad. Vamos a crear nuestro primer informe.

18.2 Creando nuestro primer informe

Creando el primer fichero .rmd

Imagen/gráfica 18.1: Creando el primer fichero .rmd

En la imagen anterior tienes el menú para crear el primero fichero con extensión .rmd (la extensión de los archivos R Markdown). Tras hacer click en el botón File << New File << R Markdown, nos aparecerá el siguiente menú.

Creando el primer fichero .rmd

Imagen/gráfica 18.2: Creando el primer fichero .rmd

Como ves nos varias opciones de formatos de salida:

  • .pdf
  • .html (documento dinámico, permite la interacción con el usuario, como una «página web»)
  • .doc (nada recomendable)

De momento dejaremos marcado el formato HTML que viene por defecto, y escribiremos el título de nuestro documento. Tras ello tendremos nuestro archivo .Rmd (fíjate arriba que ya no es un script .R como los que hemos abierto hasta ahora)

Creando el primer fichero .rmd

Imagen/gráfica 18.3: Creando el primer fichero .rmd

Un fichero .Rmd se divide básicamente en tres partes

  1. La cabecera (eso que tienes al inicio entre ---)
  2. Texto (que podremos mejorar con negritas (escrito como **negritas**, con doble astérisco al inicio y final), cursivas (_cursivas_, con barra baja al inicio y final) o destacar nombres de funciones o variables de R (con R). Recuerda que puedes añadir ecuaciones como \(x^2\) (he escrito $x^2$, la ecuación entre dólares).
  3. Código R.

18.2.1 Cabecera YAML

La cabecera están en formato YAML, y contiene los metadatos del documento: título, autor, fecha, estilos (si los tuviésemos), etc. Para probar, vamos a cambiar la cabecera que nos ha generado por defecto de la siguiente forma:

  • Title: “Probando Probando”
  • author: “Señor X”
  • date: “11/7/2014”
  • output: html_document (le indicamos el formato de salida, en este caso un documento HTML)

Tras tunear nuestra cabecera borraremos todo lo que viene después para empezar desde cero.

Fichero .Rmd vacío, solo con la cabecera

Imagen/gráfica 18.4: Fichero .Rmd vacío, solo con la cabecera

18.2.2 Texto

Solo hay una cosa importante a tener en cuenta en este entorno R Markdown: salvo que indiquemos lo contrario, todo lo que vamos a escribir en el documento es texto. No código R. Texto plano que podremos mejorar un poco con algun detalle, pero texto.

Vamos a empezar nuestro documento escribiendo por ejemplo la siguiente frase

Este material ha sido diseñado como complemento y recursos de apoyo al curso de la Escuela de Invierno de la UCM titulado «Analizando datos, visualizando información, contando historias», celebrado presencialmente del 31 de enero al 4 de febrero de 2022 (16:00 a 21:00 horas, de lunes a viernes).

Una vez que hemos escrito el textos vamos a guardar el archivo .Rmd haciendo click en el botón Guardar (yo he llamado al archivo primer_rmarkdown.Rmd). Tras guardar el documento, tejeremos nuestro documento haciendo click en el botón Knit.

Primer informe html

Imagen/gráfica 18.5: Primer informe html

Al «tejer» el archivo se nos habrá generado (seguramente en una ventana al margen) un archivo .html, que podemos incluso abrir en nuestro navegador si hacemos click en Open in Browser. Hemos creado nuestro primer informe, obviamente vacío de momento. Vamos a mejorar un poco el texto haciendo lo siguiente:

  • Vamos a añadir negrita a la frase curso de la Escuela de Invierno de la UCM (poniendo ** al inicio y al final).

  • Vamos añadir cursiva a la palabra material (poniendo _ al inicio y al final).

  • Vamos añadir un enlace, https://www.ucm.es/eci//cursoecic02-pre, asociándolo al título «Analizando datos, visualizando información, contando historias». Para ello el título lo ponemos entre corchetes y justo detrás el enlace entre paréntesis [«Analizando datos, visualizando información, contando historias»](https://www.ucm.es/eci//cursoecic02-pre)

Tuneando nuestro primer informe html

Imagen/gráfica 18.6: Tuneando nuestro primer informe html

Tras hacerlo volvemos a clickar en Knit para tejer el informe y obtendremos la siguiente salida.

Salida del informe html

Imagen/gráfica 18.7: Salida del informe html

Tenemos palabras en cursiva, en negrita, y ahora el título del curso es un vínculo a una web a la que podemos hacer click.

18.2.3 Chunks: código R

Para añadir código R debemos crear nuestras cajas de código llamadas chunks: altos en el camino en nuestro texto markdown donde podremos incluir código. Para incluir uno deberá de ir encabezado de la siguiente forma.

Encabezado/final del chunk

Imagen/gráfica 18.8: Encabezado/final del chunk

Dentro de dicha cajita (que tiene ahora otro color en el documento) escribiremos código R, como lo veníamos haciendo hasta ahora. Vamos por ejemplo a definir dos variables y su suma de la siguiente manera, escribiendo dicho código en nuestro .Rmd (dentro de ese chunk)

# Código R
x <- 1
y <- 2
x + y
## [1] 3
Primer chunk

Imagen/gráfica 18.9: Primer chunk

Como ves dentro de esos chunks puedes comentar código como siempre con # (ahora veremos que hace # fuera de esas cajas de código). Tras hacerlo tejemos de nuevo y obtenemos ahora un documento que tiene una caja de código y su salida, en este caso x + y.

Salida del html con el primer chunk

Imagen/gráfica 18.10: Salida del html con el primer chunk

Somos capaces de escribir en un mismo documento texto con cierto formato, código R y la salida del resultado, permitiéndonos generar informes (ya veremos como incluir gráficas). De hecho, lo más práctico para tomar apuntes de R es ir anotando lo aprendido en un archivo .Rmd, permitiéndonos incluir explicaciones a nuestros códigos y salidas.

Los chunk de código pueden tener un nombre o etiqueta, de forma que podamos referenciarlos de nuevo para no repetir código. Si la etiqueta es por ejemplo chunk-1 (no se pueden poner espacios, preferiblemente solo letras y guiones), se añadirá como se muestra en la imagen inferior.

Etiquetando un chunk y reciclándolo

Imagen/gráfica 18.11: Etiquetando un chunk y reciclándolo

Así queda nuestra salida: con un chunk que hemos escrito y otro que no hemos tenido que escribir ya que hemos usado la etiqueta del que ya teníamos escrito.

Salida tras etiquetar un chunk y reciclándolo

Imagen/gráfica 18.12: Salida tras etiquetar un chunk y reciclándolo

18.2.4 Organizando el documento

Con todo incluido en el documento podemos dividirlo en secciones y subsecciones. Para ello usaremos la sintaxis de markdown, poniendo almohadillas: una # para secciones, ## para subsecciones, ### para subsubsecciones, etc. Por ejemplo, vamos a

  • Hacer una sección principal que sea # Primer informe
  • Tras ello añadiremos la parte de texto.
  • Creamos una subsección que se titule ## Chunks de código donde incluiremos los dos chunks que tenemos hasta ahora.
Secciones en el archivo .rmd

Imagen/gráfica 18.13: Secciones en el archivo .rmd

De esta forma podemos organizar nuestro documento en secciones y subsecciones.

Secciones en la salida

Imagen/gráfica 18.14: Secciones en la salida

Además podemos incluir tras el título (y entre llaves {}) etiquetas (con la almohadilla {#etiqueta}) para luego referenciar dichas secciones en el documento. Vamos a etiqueta # Primer informe {#seccion-1} y ## Chunks de código {#chunks}. Añadiremos una nueva sección donde haremos las referencias a dichas secciones como [Sección](#seccion-1) y [Subsección](#chunks).

Referencias a secciones y subsecciones

Imagen/gráfica 18.15: Referencias a secciones y subsecciones

También podemos organizar nuestro código creando listas, usando * como ítems.

Creando ítems en el rmd

Imagen/gráfica 18.16: Creando ítems en el rmd

Salida tras crear ítems

Imagen/gráfica 18.17: Salida tras crear ítems

18.2.5 Personalizando los chunks

No sé si te has fijado que en cada chunk aparece una botón de play: pulsándolo podemos tener la ejecución y salida de cada chunk en nuestro .Rmd, sin tener que esperar a «tejer» (con Knit) todo el documento para ver lo que vamos ejecutando.

Ejecutar chunk a chunk

Imagen/gráfica 18.18: Ejecutar chunk a chunk

Chunk ejecutado

Imagen/gráfica 18.19: Chunk ejecutado

Además podemos incluir código R dentro de la línea de texto. Por ejemplo, podemos definir una variable para luego mostarla como 3 (en lugar de mostrar el texto x ejecuta el código R mostrando la variable).

Código inline

Imagen/gráfica 18.20: Código inline

Salida del código inline

Imagen/gráfica 18.21: Salida del código inline

 

Los chunk podemos personalizarlo con algunas opciones, pasándolos como argumentos dentro de las llaves {r etiqueta, ...}.

  • include = FALSE: se ejecuta el código pero no se muestra ni código ni resultados en la salida final (pero lo que se ejecuta puede ser usado en otros chunks futuros).

  • echo = FALSE: se ejecuta el código y se muestra el resultado pero no el código en la salida final.

  • eval = FALSE: se muestra pero no se ejecuta el código en la salida final.

  • message = FALSE: se ejecuta el código pero no se muestran los mensajes de salida que tendríamos en consola (en caso de existir).

  • warning = FALSE: se ejecuta el código pero no se muestran los warning que tendríamos en consola (en caso de existir).

  • error = TRUE: se ejecuta el código pero permite ejecutar el código con errores mostrando los mensajes de error que tendríamos en consola (en caso de existir).

Puedes ver las diferentes salidas en el archivo primer_rmarkdown.Rmd en https://github.com/dadosdelaplace/courses-ECI-2022/blob/main/scripts/primer_rmarkdown.Rmd.

 

Estas opciones podemos aplicarlas chunk a chunk o fijar los parámetros de forma global con knitr::opts_chunk$set() (dentro de un chunk), pasándole como argumentos dichas opciones (por ejemplo, knitr::opts_chunk$set(echo = FALSE)).

18.2.6 Variables y ecuaciones

Por último en este primer documento vamos a añadir una subsección ## Variables y ecuaciones donde añadiremos un chunk asignando la suma x + y a una variable z, escribiendo antes en texto el nombre de la variable (z) y la fórmula ($z = x + y$).

Variables y ecuaciones

Imagen/gráfica 18.22: Variables y ecuaciones

Salida

Imagen/gráfica 18.23: Salida

18.3 Segundo rmarkdown

Visto como hacer un rmarkdown sencillo, vamos a aprender algunas formas de personalizarlo.

18.3.1 Personalizando la cabecera

Una primera personalización en la cabecera puede ser automatizar la fecha, indicándole que sea la fecha del momento en el que se genere el informe con Sys.Date()

## [1] "2022-01-30"
format(Sys.time(), '%d de %B de %Y')
## [1] "30 de January de 2022"

El código R podemos introducirlo en la cabecera entre las comillas.

Personalizando cabecera

Imagen/gráfica 18.24: Personalizando cabecera

También podemos indicarle en la cabecera que añadamos un índice (toc, por sus siglas en inglés) al documento con toc: true.

Índice

Imagen/gráfica 18.25: Índice

Índice

Imagen/gráfica 18.26: Índice

Además con toc_depth: podemos indicarle la profundidad de ese índice (hasta donde queremos que indexe, si subsecciones, subsubsecciones, etc), y number_sections: true nos hará que las secciones se numeren.

Numeración de secciones

Imagen/gráfica 18.27: Numeración de secciones

Numeración de secciones

Imagen/gráfica 18.28: Numeración de secciones

18.3.3 Mostrando imágenes

Por último, con knitr::include_graphics() podremos incluir imágenes, bien que tengamos en nuestro local, o bien a través de la ruta web de la imagen. Con out.width podremos modular el tamaño que queremos que ocupe la imagen, con fig.align = 'center' la centramos y con fig.cap = 'Ejemplo de imagen' ponemos un pie de foto

Incluir imagen

Imagen/gráfica 18.29: Incluir imagen

Incluir imagen

Imagen/gráfica 18.30: Incluir imagen