Introducción

En este taller usted aprenderá el uso del formato RMarkdown el cual permite, gracias a su integración con el código, presentar informes con datos, tablas y gráficas actualizados sin necesidad de importación de gráficas o creación manual de tablas, su uso permite realizar correcciones simultaneas de los datos y gráficas del informe solo cambiando la raíz del problema. Sistematizando el trabajo y ahorrando gran cantidad de tiempo en informes que se generan con regularidad y permitiendo una investigación reproducible.

Objetivos

Conceptos básicos a desarrollar

En esta práctica se desarrollarán los siguientes conceptos:

Bibliotecas necesarias para el taller

library(tidyverse)
library(lubridate)
library(incidence)

Inicio

Para comenzar, abra RStudio y cree un proyecto definiendo la carpeta de trabajo donde se van a colocar todos los archivos relacionados con esta práctica (ver figura 1).

(Figura 1. Ruta para crear un proyecto)

A continuación, siguiendo la ruta File>New File>R Markdown (figura 2) cree un archivo de R Markdown definiendo: título, autores y con formato de salida html.

(Figura 2. Ruta para crear archivo .Rmd)

Aparecerá en el panel superior izquierdo, un nuevo archivo con un encabezado delimitado por --- que incluye las definiciones anteriores más la fecha actual. Borre todo el texto que se presenta después del encabezado y guarde este archivo en la carpeta de trabajo.

En las secciones que se presentan a continuación, encontrará la información requerida para empezar a generar un documento en R Markdown seguido de un Ejercicio que busca poner en práctica lo aprendido.

Para tener una vista del documento a medida que va escribiendo, en la barra de herramientas seleccione la opción Preview in Viewer Pane y marque el botón Knit como se muestra en la figura 3, así irá “tejiendo” su documento.

(Figura 3. Tejer archivo .Rmd)

En el panel inferior derecho aparecerá la vista correspondiente. Como notará, en el botón “Knit” hay otras alternativas distintas al formato de .html como .pdf y .Word; en este taller trabajaremos en el formato .html pero las instrucciones descritas en general aplican para los demás formatos.

Formato de texto

  1. Para incluir el títulos de una sección, se coloca el símbolo # y a continuación el nombre de la sección en una linea única. Para colocar sub-títulos se utiliza ## y para cada sub-título adicional se agrega otro #.
  2. Para escribir palabra en negrillas o cursiva coloque **palabra** o *palabra* respectivamente.
  3. Un superíndice se colocar así: palabra^2^ y un subíndice se coloca así:palabra~2~.
  4. Así se tacha una palabra:~~palabra~~.
  5. Para colocar texto en un bloque aparte, se antecede este texto con el símbolo > en una línea única, así: > texto en bloque.

Ejercicio 1.

Reproduzca el siguiente fragmento:

________________________________________________________________

Primera práctica en R Markdown

Herramientas de texto

Se puede usar negrillas o también letra cursiva. De igual forma podemos escribir palabras consuper-índices y palabras con sub-índices. Aunque no queremos cometer erores, perdón errores, siempre podemos resaltar términos importantes, así:

¡ESTA INFORMACIÓN ES IMPORTANTE!

________________________________________________________________

Pie de página y enlaces

Para incluir un pie de página colocamos: palabra [^1] y en una linea aparte escribimos:[^1]: texto del pie de página. palabra1

Para incluir un enlace a una página de internet tenemos las dos siguientes opciones:

Listas

Una listas pueden ser sin orden o con orden. Para crear una lista sin orden se coloca:

* texto1
+ texto2
+ texto2
- texto 3
* texto 4
+ texto 5

y para una lista con orden:

1. texto1
2. texto 2
a. texto 3
i) texto 4
ii) texto 5
b. texto 6
3. texto 7

En ambos tipos de lista, para identificar cada sub-ítem adicional se requieren exactamente 4 espacios adicionales.

Ejercicio 2

Reproduzca el siguiente fragmento:

________________________________________________________________

Ejercicio pie de página, enlaces y listas

Coloque un pie de página a esta palabra: palabra2. Ahora en el siguiente enlace puede consultar información relevante sobre casos de Covid 19 en el mundo ourworldindata. En esta página encontrará aspectos relevantes como:

  1. Casos reportados
  1. Por países
  2. Acumulados o diarios
  1. Mortalidad
  1. Por países
  2. Acumulados o diarios
  3. En diferentes escalas.

________________________________________________________________

Tablas

Se pueden construir tablas escribiendo uno a uno los valores en cada celda, así:

:Título de la tabla

|izquierda|derecha|centrada|
|:--------|------:|:------:|
|texto 1|23.5|na|
|texto 2|65.4|BOGOTA D.C.|
|texto 3|44.2|Cund.|

la ubicación de los : en la segunda línea de la tabla define la alineación del texto en las columnas y la cantidad de - que se coloquen definen el ancho de cada columna.

Esta es la tabla resultante:

Título de la tabla
izquierda derecha centrada
texto 1 23.5 na
texto 2 65.4 BOGOTA D.C.
texto 3 44.2 Cund.

Ejercicio 4

Reproduzca el siguiente fragmento

________________________________________________________________

Ejercicio Tablas

A continuación se presentan los primeros resultados.

Estimación de la prevalencia del desenlace D
Lugar Prevalencia D n
Ciudad 1 0.35 156
Ciudad 2 0.31 285
Ciudad 3 0.25 465
Ciudad 4 0.58 118
Ciudad 5 0.22 456

Ahora, se presentan otros resultados.

Estimación de la prevalencia del desenlace O
Lugar Prevalencia O n
Ciudad 1 0.25 356
Ciudad 2 0.32 485
Ciudad 3 0.21 365
Ciudad 4 0.18 218
Ciudad 5 0.40 456

________________________________________________________________

Inserción de código R en el documento

Para incluir código de R tiene que introducir un “trozo” en el documento marcando en la barra de herramientas el icono insert como se muestra en la figura 4.

(Figura 4. Insertar Chunk)

Aparecerá un espacio delimitado por ```. Todo lo escrito al interior se ejecutará como código de R:

```{r}

```

Para poder realizar los siguientes ejemplos, necesita cargar el paquete tidyverse.

Para los ejemplos también necesita datos, por favor cargue los datos de los casos de Covid 19 con los que ha venido trabajando.

Teniendo datos, ya puede generar algunos resultados y gráficos; se recomienda ir copiando y pegando el código en distintos “trozos” en su R Markdown, e ir “tejiendo” su documento.

Data frames y tablas

Ejercicio 5

Primero, configure su documento para que pueda dibujar correctamente los data frames

Cambie la parte del encabezado del documento, donde dice lo siguiente:

output: html_document

Por este otro texto

output:
  html_document:
    df_print: paged
    

Cargue los datos que utilizaremos para este ejercicio

library(tidyverse)
library(lubridate)
library(incidence)

# Descarga el archivo de datos covid desde internet
# Alternativamente, puede Ud descargar el archivo manualmente, copiarlo a la carpeta data
# y cargarlo directamente con el comando:
# readr::read_rds("data/datos_covid.RDS")
url_data <- "https://github.com/TRACE-LAC/TRACE-LAC-data/blob/main/datos_covid.RDS?raw=true"
covid <- readr::read_rds(url_data)

names(covid) <- names(covid) %>% epitrix::clean_labels()

A <- covid %>% group_by(nombre_departamento) %>% summarise(casos= n()) %>% arrange(desc(casos))

B <- A[1:20,]
B

Luego, obtenga las primeras 20 localizaciones con el mayor número de casos de Covid a la fecha de descargue del archivo.

Se puede utilizar la función kable del paquete knitr (Xie et al. 2021) (no olvide instalar este paquete primero) para editar la tabla anterior:

library(knitr)
kable(B, caption = "Tabla usando kable")
Tabla usando kable
nombre_departamento casos
BOGOTA 146688
ANTIOQUIA 75545
VALLE 44845
CUNDINAMARCA 26496
SANTANDER 23265
BARRANQUILLA 22030
CARTAGENA 12960
ATLANTICO 11231
BOYACA 10272
NORTE SANTANDER 9876
TOLIMA 9821
CORDOBA 9650
CALDAS 9620
RISARALDA 8726
CESAR 8724
META 8504
NARIÑO 8453
HUILA 8223
STA MARTA D.E. 6657
CAUCA 6004

Ahora, incluyamos un gráfico de barras de la tabla anterior.

B$nombre_departamento <- factor(B$nombre_departamento,levels = B$nombre_departamento[order(B$casos)])

ggplot(data=B,aes(x=nombre_departamento,y=casos/1000000))+
  geom_bar(fill="darkblue",alpha=0.7,col="purple",size=0.5,stat = "identity")+
  coord_flip()+
  labs(title="Gráfico 1. Número de casos de covid", y="Número de casos (por millón de hab.)",x="departamentos con mayor número de casos",caption="Fuente: datos.org")

Ejercicio 6

Usando los datos ya cargados en el objeto data, incluya en su documento de R Markdown dos medida de resumen y dos gráfico que usted haya creado.

Múltiples gráficos

Para describir el comportamiento del número de muertes y diagnosticos reportados por cada departamento, a continuación se escribe la función Graf.muer.diag que permite obtener este resultado indicando la localización de interés. Primero cree la función con el siguiente código:

Graf.muer.diag<- function(bd,nb_diag, nb_muerte, nivel, lugar, fecha_de_diagnostico){
  
  bd[[nb_diag]] <- as.Date(bd[[nb_diag]])
  
  bd <- bd %>% filter(between(x = as_date(bd[[nb_diag]]), left = as_date("2021-01-01"),right = as_date("2021-12-31"))) 
  
  diag<-as_date(bd[bd[[nivel]]==lugar,][[nb_diag]])
  
  muerte<-as_date(bd[bd[[nivel]]==lugar,][[nb_muerte]])
  
  diag_sem <- incidence(diag, interval = 30)
  muer_sem <- incidence(muerte, interval = 30)
  
  diag_sem_df <- as.data.frame(diag_sem) %>% mutate(class = "Diagnosticos")
  
  muerte_sem_df <- as.data.frame(muer_sem) %>% mutate(class = "Muertes")
  
  diag_muer_sem_df <- rbind(diag_sem_df, muerte_sem_df)
  diag_muer_sem_df$dates <- diag_muer_sem_df$dates %>% as.Date()
  
  grafica <- ggplot(data = diag_muer_sem_df) +
    geom_bar(aes(x = dates, y = counts, fill = class), stat = "identity")+
    scale_x_date(date_breaks = "10 week", date_labels = "%W-%Y")+
    scale_fill_manual(values = c("Diagnosticos"="green","Muertes"="black"))+
    ggtitle(paste("Incidencia para", lugar))+
    theme(axis.text.x = element_text(face="bold", color="#2F4F4F", size=8, angle=90))
  return(grafica)
}

pruebe la función, por ejemplo con BOGOTA escribiendo:

Graf.muer.diag(bd = covid, nb_diag = "fecha_de_diagnostico", nb_muerte = "fecha_de_muerte",
                  nivel ="nombre_departamento", lugar = "BOGOTA")

Ahora, podemos incluir múltiples gráficos de la siguiente forma:

p1 <- Graf.muer.diag(bd = covid, nb_diag = "fecha_de_diagnostico", nb_muerte = "fecha_de_muerte",
                  nivel ="nombre_departamento", lugar = "CAUCA")

p2 <- Graf.muer.diag(bd = covid, nb_diag = "fecha_de_diagnostico", nb_muerte = "fecha_de_muerte",
                  nivel ="nombre_departamento", lugar = "NARIÑO")

p3 <- Graf.muer.diag(bd = covid, nb_diag = "fecha_de_diagnostico", nb_muerte = "fecha_de_muerte",
                  nivel ="nombre_departamento", lugar = "SANTANDER")
gridExtra::grid.arrange(p1, p2, p3, ncol = 2)

Ejercicio 7

  1. Seleccione un grupo de localizaciones de su interés e incluya sus gráficos en su documento de RMarkdown.
  2. Una los gráficos que elaboró en el Ejercicio 4 en un solo gráfico.

El libro de referencia para conocer todas las herramientas disponibles en RMarkdown se pueden consultar en este enlace: https://bookdown.org/yihui/rmarkdown-cookbook/ (Riederer n.d.)

Dashboard y Shiny

A continuación, vamos a construir un tablero de control. Para ello utilizaremos el paquete flexdashboard (Iannone et al. 2020) (install.packages("flexdashboard")). Luego de instalarlo, cree un nuevo archivo de R Markdown como se presentó en la figura 2, pero ahora seleccione From Template>FlexDashboard (figura 5).

(Figura 5. Crear tablero de control)

Aparecerá una plantilla (figura 6) que permite crear un documento organizado por secciones de columna o filas dentro de las cuales se podrán colocar distintos objetos como tablas, gráficos, texto e incluso entradas de valores que permitan realizar por ejemplo, gráficos dinámicos. En la figura 6 se presenta esta plantillas con una breve explicación de cada sección.

(Figura 6. Plantilla Dashboard)

Pruebe “tejiendo” esta plantilla para conocer la vista preliminar.

Ahora, utilizando el registro de casos de covid reportados por la universidad de Oxford y la función tasa.muertes creada previamente, vamos de construir un primer tablero de control que incluya un botón para seleccionar una localización y a continuación se genere el gráfico de esta localización utilizando nuestra función. Para ello, nos vamos a apoyar del paquete Shiny (“Shiny” n.d.) agregando una instrucción en el encabezado. En la figura 7 se presenta el código necesario para esto, junto con una breve descripción.

(Figura 7. Plantilla Dashboard)

En Instrucción para definir las entradas de la figura anterior, los parámetros de la función selectInput son:

En Instrucciones para definir la salida de la figura 7, tenemos la función renderPlot que permite incluir gráfico en nuestro tablero de control. Entre los {}, colocamos la función tasa.muertes y la evaluamos con el nombre input$lugar, que fue donde definimos se guardaría la selección en selectInput.

Ejercicio 8

Reconstruir el ejemplo de la figura 7.

Si por algún motivo, ocurre este error:

could not find function "selectInput"

Debe agregar esta código entre la línea 12 y 13:

library(shiny)

Existen muchas opciones a incluir en un tableros de control. En el siguiente enlace se presenta una descripción detallada de los paquetes que utilizamos: https://rmarkdown.rstudio.com/flexdashboard/

Publicación

Podrá encontrar el ejemplo anterior en la siguiente dirección: https://cjrr.shinyapps.io/prueba/. Es decir, que se puede compartir un tablero de control utilizando la plataforma shinyapp.io a la que se puede acceder desde el siguiente enlace https://www.shinyapps.io/admin/#/login. Para esto, primero cree una cuenta en la página y a continuación, al ingresar por primera vez a la cuenta encontrará las instrucciones necesarias para enlazar su RStudio a esta cuenta.

En el mismo lugar encontrará las instrucciones para publicar su dashboard:

library(rsconnect)
rsconnect::deployApp('path/to/your/app')

Donde path/to/your/app es el nombre del archivo del dashboard que Ud. creó.

Bibliografía

Iannone, Richard, J. J. Allaire, Barbara Borges, RStudio, Keen IO (Dashboard CSS), Abdullah Almsaeed (Dashboard CSS), Jonas Mosbech (StickyTableHeaders), et al. 2020. “Flexdashboard: R Markdown Format for Flexible Dashboards.” https://CRAN.R-project.org/package=flexdashboard.
Riederer, Emily, Christophe Dervieux. n.d. R Markdown Cookbook. Accessed April 7, 2021. https://bookdown.org/yihui/rmarkdown-cookbook/.
“Shiny.” n.d. Accessed April 7, 2021. https://shiny.rstudio.com/.
Xie, Yihui, cre, Adam Vogt, Alastair Andrew, Alex Zvoleff, Andre Simon (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins, et al. 2021. “Knitr: A General-Purpose Package for Dynamic Report Generation in R.” https://CRAN.R-project.org/package=knitr.

Sobre este documento

Contribuciones

  • Carlos Javier Rincon: Versión inicial
  • Andree Valle-Campos: Ediciones menores
  • José M. Velasco-España: Modificaciones
  • Jaime A. Pavlich-Mariscal: Edición

Contribuciones son bienvenidas vía pull requests.

Asuntos legales

Licencia: CC-BY Copyright: Carlos Javier Rincon, 2021


  1. información clave explicado palabra↩︎

  2. información clave explicado palabra↩︎

  3. Para nuestro ejemplo, será el listado de localizaciones disponibles en data.↩︎