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.
Reconocer la importancia de generar informes fácilmente actualizables.
Reconocer cómo editar datos en RMarkdown.
Reconocer cómo introducir código junto al informe.
Definir que es lenguaje Markdown
Listar los usos del lenguaje Markdown
Reconocer los usos del lenguaje Markdown en R.
Describir el proceso para crear un documento en Rmarkdown
En esta práctica se desarrollarán los siguientes conceptos:
Rmarkdown
Reproducibilidad
library(tidyverse)
library(lubridate)
library(incidence)
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.
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.
#
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 #
.**palabra**
o *palabra*
respectivamente.palabra^2^
y un subíndice se coloca así:palabra~2~
.~~palabra~~
.>
en una línea única, así: > texto en bloque
.Reproduzca el siguiente fragmento:
________________________________________________________________
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!
________________________________________________________________
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:
<https://www.rstudio.com/resources/cheatsheets/#rmarkdown>
[ayuda](https://www.rstudio.com/resources/cheatsheets/#rmarkdown)
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.
Reproduzca el siguiente fragmento:
________________________________________________________________
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:
________________________________________________________________
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:
izquierda | derecha | centrada |
---|---|---|
texto 1 | 23.5 | na |
texto 2 | 65.4 | BOGOTA D.C. |
texto 3 | 44.2 | Cund. |
Reproduzca el siguiente fragmento
________________________________________________________________
A continuación se presentan los primeros resultados.
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.
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 |
________________________________________________________________
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
.
install.packages("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.
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")
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")
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.
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)
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.)
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
.
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/
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ó.
Contribuciones son bienvenidas vía pull requests.
Licencia: CC-BY Copyright: Carlos Javier Rincon, 2021