1 Qué es RMarkdown

(Para profundizar contenidos de este curso, o aprender otros aspectos no incluidos, sugerimos tener en cuenta este tutorial de RMarkdown).

De acuerdo a Wikipedia:

Markdown es un lenguaje de marcado ligero creado por John Gruber que trata de conseguir la máxima legibilidad y facilidad de publicación tanto en su forma de entrada como de salida, inspirándose en muchas convenciones existentes para marcar mensajes de correo electrónico usando texto plano.


2 Por qué usar RMarkdown?

Por que es:

Brevemente, los usuarios normales lo encontrarán útil en cualquier caso, especialmente cuando necesitas algo mejor que el texto plano pero menos funcional que MS Word. Para desarrolladores, si tienes pereza de escribir código HTML, amarás Markdown. Más aún, Github y muchos sitios favorecen markdown para archivos README en proyectos. Eso significa que necesitarás Markdown en tu vida de una manera u otra.


3 Cómo funciona

Los archivos rmarkdown son texto plano, con extensión .rmd.

El código se ejecuta clickeando en Knit, en el area de programación. El botón está al lado de la lupa. Se hace click en la flechita de opciones (al lado del ícono) se podrá observar que Knit genera reportes en formato html, pdf o word.

Knit ejecuta todos los fragmentos de código y crea un nuevo markdown (.md) que incluye el código y su salida.

El archivo .md es luego procesado por pandoc que es responsable de generar el formato final.

Para crear un nuevo .rmd, en RStudio, lo más facil es File -> New File -> R Markdown....


4 Sintaxis

Los documentos .rmd tienen una estrcutura muy simple: 1. Encabezado 2. Cuerpo: en donde se desarrolla todo el documento. 3. Bibliografía o citas finales. (sección opcional).

4.1 Encabezados

Los archivos .rmd deben comenzar con un encabezado que define un conjunto de parámetros del reporte.

Por ejemplo, el siguiente encabezado pertenece al .rmd que genera este html:

---
title: 'Reportes con RMarkdown'
author: "Ignacio Cassol"
date: '2020-06-29'
output:
  html_document: # El output será un html.
    highlight: textmate # Resalto de sintaxis
    keep_md: yes # Compilar a formato .md
    number_sections: yes # Que las secciones/subsecciones tengan número
    self_contained: false # Usar dependencias almacenadas localmente
    theme: flatly # definición del look&feel del output. 
    toc: yes # Tabla de contenidos
    toc_depth: 2 # profundidad de tabla de contenidos
---

Aquí encontrarás los posibles valores que pueden tomar los parámetros para el formato de salida HTML.

4.1.1 Formatos de salidas

el comando output: del encabezado admite dos tipos de documentos: documents y presentations. Listamos los formatos disponibles:

Dependiendo del formato, cada parámetro tiene sus propias opciones.

Aquí encontrarás los formatos soportados de salida. La galería ejectua utiliza el comando render() para generar la salida. Es una opción válida. Nosotros estamos usando la opción de hacer click sobre el botón “Knit”.

4.1.2 Sugerencias sobre formatos

Aquí encontrarás una galería de temas (themes) para los outputs.

Te sugerimos explorar el formato de salida flexdashboard::flex_dashboard, útil para hacer presentaciones que simulan ser una web.

4.2 Cuerpo del .rmd

Luego del encabezado, ya estás en condiciones de comenzar a programar el documento. Para esto, tendrás que conocer la sintáxis básica.

Aquí encontrarás una guía de toda la sintaxis básica de R Markdown.

4.3 Secciones/subsecciones

Las secciones se señalan con #:

# Sección 1
## Sección 1.1
### Sección 1.1.1

Y se mostrará:

Sección 1

Sección 1.1

Sección 1.1.1


Las secciones pueden tener asociado un id para que se pueda hacer un link de referencia dentro del documento.

Ejemplo:

### Cabecera 1 {#cabecera1 .unnumbered}

[Enlace a Cabecera 1](#cabecera1)

Cabecera 1

Enlace a Cabecera 1


4.3.1 Listas con bullets:

* Item 1
    * Item 1.1
* Item 2
* Item 3

Y se mostrará:

  • Item 1
    • Item 1.1
  • Item 2
  • Item 3

4.3.2 Listas numeradas:

1. Item 1
2. Item 2
3. Item 3

Y se mostrará:

  1. Item 1
  2. Item 2
  3. Item 3

4.3.3 Estilos de lafuente

El texto en cursiva va decorado de guiones bajos o asteriscos, por ejemplo, _text_ o *texto*. El texto en negrita se programa utilizando un par de asteriscos dobles, por ejemplo, **texto**. Un par de tildes ~ convierte el texto en un subíndice, por ejemplo, H~3~PO~4~ representa H3PO4. Un par de ^ produce un superíndice, por ejemplo, Cu^2+^ produce Cu2+.

Ejemplos:

_text_ -> text

*text* -> text

**text** -> text

***text*** -> text


4.3.4 Expresiones matemáticas

Las expresiones matemáticas se escriben con la sintaxis del lenguaje latex entre $. Por ejemplo:

$f(k) = {n \choose k} p^{k} (1-p)^{n-k}$ -> \(f(k) = {n \choose k} p^{k} (1-p)^{n-k}\).

Aquí puedes encontrar una cheat sheet con la sintaxis de Latex.

También se pueden definir entornos matemáticos entre $$. Por ejemplo:

$$X = \begin{bmatrix}1 & x_{1}\\
1 & x_{2}\\
1 & x_{3}
\end{bmatrix}$$

Y se mostrará:

\[X = \begin{bmatrix}1 & x_{1}\\ 1 & x_{2}\\ 1 & x_{3} \end{bmatrix}\]


4.4 Pestañas

Es posible organizar contenidos en pestañas como el siguiente ejemplo:

###Autos {.tabset .unnumbered}

Auto Nuevo

Un Super Telsa!

Un Super Telsa!

Auto Viejo

Falta pintura…

Falta pintura…

Esto se realiza agregando el atributo {.tabset} a una sección o subsección.

Por ejemplo, el codigo correspondiente a los tabs anteriores es:

##Autos {.tabset .unnumbered}

### Auto Nuevo {- .unnumbered}
![Un Super Telsa!](./resources/tesla.jpeg)

### Auto Viejo {- .unnumbered}
![Falta pintura...](./resources/old-car.jpeg)

## {.unnumbered}

Es posible modificar el aspecto y el comportamiento de la sección de pestañas. El atributo .tabset-fade apaga/enciende el bloque seleccionado/deseleccionado. Y el atributo .tabset-pills le da formato de botones a las pestañas.

Por ejemplo:

## Autos {.tabset .tabset-fade .tabset-pills .unnumbered}

### Auto Nuevo {- .unnumbered}
![Un Super Telsa!](./resources/tesla.jpeg)

### Auto Viejo {- .unnumbered}
![Falta pintura...](./resources/old-car.jpeg)

## {.unnumbered}

Y se mostrara:

Autos

Auto Nuevo

Un Super Telsa!

Un Super Telsa!

Auto Viejo

Falta pintura…

Falta pintura…


4.4.1 Instrucciones varias

  1. Para marcar el texto como código en programación, usa un par de comillas invertidas, por ejemplo, `código` -> código.

  2. Los hipervínculos se crean utilizando la sintaxis [texto](enlace), por ejemplo, [RStudio](https://www.rstudio.com).

  3. La sintaxis de las imágenes es similar: sólo agrega un signo de exclamación, por ejemplo,![Texto alternativo o título de la imagen](ruta/a/imagen).

  4. Las notas al pie se colocan dentro de los corchetes después de ^[], por ejemplo, ^[Esta es una nota al pie.].

  5. Las líneas horizontales se generan con tres caracteres seguidos de -, * o _.


4.5 Bloques de código

Para los desarrolladores, este servicio es de mucha importancia. En R Markdown se pueden copiar partes de código de muchos lenguajes y setear su ejecución. Los bloques de código deberán estar decoradas con ```{} …código… ```.

Los bloques de código -según el seteo que se realice en el header del bloque- se ejecutan en el momento en que se compila el .rmd.

Hay muchas cosas que puede hacer en un bloque de código: puede producir salida de texto, tablas o gráficos. Tendrás un control preciso sobre todas estas salidas a través de las opciones que se pueden setear dentro de los corchetes. Por ejemplo, puede elegir ocultar la salida de texto a través de la opción results = 'hide', o configurar la altura de una imagen insertada en 4 pulgadas a través de fig.height = 4. Las opciones deben estar separadas por comas, por ejemplo:

```{r, chunk-label, results=‘hide’, fig.height=4}

```

En el ejemplo anterior, el bloque de código recibió el nombre chunk-label.

Hay una gran variedad de opciones de configuración de los bloques de código. Además, combinados, ofrecen muchas más posibilidades. Aquí puedes ver algunas descripciones.

Esas opciones de salida se pueden personalizar indicando parámetros dentro del encabezado del bloque, que está entre {} Destacamos 5 argumentos:

  • include = FALSE evita que el código y los resultados aparezcan en el archivo finalizado. R Markdown aún ejecuta el código en el fragmento y los resultados pueden ser utilizados por otros fragmentos.
  • echo = FALSE evita que el código, pero no los resultados, aparezcan en el archivo finalizado. Esta es una manera útil de incrustar figuras.
  • message = FALSE evita que los mensajes generados por el código aparezcan en el archivo finalizado.
  • warning = FALSE evita que las advertencias generadas por el código aparezcan en el final.
  • fig.cap = "..." agrega un título a los resultados gráficos.

Aquí puede ver qué lenguajes soporta RMarkdown.


4.6 Tablas

En .rmd las tablas se escrbien de esta manera:

| Distribución      | Nombre en R |   | Distribución  | Nombre en R |
|-------------------|-------------|---|---------------|-------------|
| Binomial          | binom       |   | Uniforme      | unif        |
| Poisson           | pois        |   | Normal        | norm        |
| Geométrica        | geom        |   | t Student     | t           |
| Hipergeométrica   | hyper       |   | F Fisher      | F           |
| Binomial Negativa | nbinom      |   | Chi-Cuadrado  | chisq       |
|                   |             |   | Exponencial   | exp         |
|                   |             |   | Gamma         | gamma       |
|                   |             |   | Weibull       | weibull     |
|                   |             |   | W de Wilcoxon | wilcox      |

Y se mostrará:

Distribución Nombre en R Distribución Nombre en R
Binomial binom Uniforme unif
Poisson pois Normal norm
Geométrica geom t Student t
Hipergeométrica hyper F Fisher F
Binomial Negativa nbinom Chi-Cuadrado chisq
Exponencial exp
Gamma gamma
Weibull weibull
W de Wilcoxon wilcox

Hay diferentes páginas web que permiten generar tablas para .rmd:

  • Markdown Table Generator: pegando tablas de excel o archivos csv, genera el texto para copiar/pegar en RMarkdown.

  • Tables Generator: permite diseñar tablas con un editor propio y generar código para diferentes lenguajes: Latex, tablas HTML, Rmarkdown entre otras.

4.6.1 El paquete kable

Una de las maneras más simples de administrar tablas en RMarkdown es con el paquete kable

Por ejemplo:

if (!is.element("kableExtra", installed.packages()[,1])){
  install.packages("kableExtra", repos = "http://mirror.fcaglp.unlp.edu.ar/CRAN/")
}
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
knitr::kable(iris[1:5, ], caption = 'A Caption')
A Caption
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5.0 3.6 1.4 0.2 setosa

Aquí encontrarás excelente tutorial para aprovechar todas las potencialidades de kable.

4.6.2 El paquete datatable

Otra opción, para hacer tablas, es utilizando el paquete DT.

Ejemplo:

if (!is.element("DT", installed.packages()[,1])){
  install.packages("DT", repos = "http://mirror.fcaglp.unlp.edu.ar/CRAN/")
}
library(DT)
datatable(mtcars, rownames = FALSE, filter="top", options = list(pageLength = 5, scrollX=T) )

Aquí puedes encontrar un tutorial que muestras las potencialidades de DT.


5 Otros formatos de salida

La sintaxis vista hasta ahora es para generar archivos HTML ya que así lo indicamos en la cabecera a través de la instrucción

output: 
  html_document:
  ...

En esta sección presentaremos muy brevemente otros formatos de salida:

5.1 Presentaciones slidy

Para conocer esta manera de presentar la salida, abre un nuevo documento RMarkdown, pega y ejecuta el siguiente código:

---
title: "Habits"
author: John Doe
date: March 22, 2005
output: slidy_presentation
---

# In the morning

## Getting up

- Turn off alarm
- Get out of bed

## Breakfast

- Eat eggs
- Drink coffee

# In the evening

## Dinner

- Eat spaghetti
- Drink wine

---

<!-- ```{r, cars, fig.cap="A scatterplot.", echo=FALSE} -->
plot(cars)
<!--```

## Going to sleep

- Get in bed
- Count sheep

5.2 Presentaciones revealjs

Primero deberás instalar el paquete:

install.packages("revealjs")
library("revealjs")

Una vez instalado el paquete, abre un nuevo documento RMarkdown, pega y ejecuta el siguiente código:

---
title: "Habits"
author: John Doe
date: March 22, 2005
output: revealjs::revealjs_presentation
---

# In the morning

## Getting up

- Turn off alarm
- Get out of bed

## Breakfast

- Eat eggs
- Drink coffee

# In the evening

## Dinner

- Eat spaghetti
- Drink wine

## Going to sleep

- Get in bed
- Count sheep

5.3 Tutoriales interactivos

Recomendamos que pruebes el paquete learnr, que tiene una gran potencialidad y facilidad para crear tutoriales interactivos. No es la finalidad de este curso, explicar su funcionamiento pero destacamos que, con learnr es posible:

  • Pedir que el usuario ingrese código y que lo pueda ejecutar en el momento.
  • Avanzar, pregunta a pregunta.
  • Hacer quiz.
  • Mostrar videos (de Youtube o Vimeo).
  • Incluir componentes Shiny.

Aquí puedes encontrar un excelente tutorial de learnr. Te sugerimos ver, este ejemplo.


6 Deployment

Luego de finalizar la construcción del reporte, en algunos casos, es necesario mostrarlo online desde una dirección URL. La actividad de subir la página a un servidor se denomina deployment. En esta sección vamos a ver una manera de hacer pública y disponible el output de un documento rmd.

Hay varias maneras de realizar el deployment de un .rmd. Señalamos dos:

  1. Utilizar el publisher de RStudio. Es un tutorial interactivo, paso a paso. Una manera de utilizar esta opción:
  1. Utilizar el render de RMarkdown. Esta opción es más versátil y es la que explicaremos a continuación.

6.1 Render

  1. Debe tener una cuenta en GitHub y un repositorio para su reporte. Si no lo tiene, cree (la cuenta y/o el repositorio).

  2. En el mismo working directory de su .rmd (y de su espacio actual de trabajo) debe generar un archivo _site.yml. Este archivo contiene especificaciones y definiciones que el Render necesita para construir la web (estática).

El formato del _site.yml es el siguiente:

name: 'Curso-R'
output_dir: '.'
navbar: # Definir un navigation bar
  title: "Curso R" 
  type: inverse 
  left: # Orientación de las pestañas
    - text: "Home" # Titulo de pestaña
      href: index.html # Path al archivo de pestaña
    - text: "Introducción"
      href: Mod1.html
    - text: "Lenguaje R"
      href: Mod2.html
    - text: "Estadística"
      href: Mod3.html
    - text: "Gráficos"
      href: Mod4.html
    - text: "Reportes"
      href: Mod5.html
    - text: "Web"
      href: Mod6.html
    - text: "Regresión"
      href: Mod7.html
output: # Output gobal
  html_document: # Variables globales
    self_contianed: true
    theme: flatly
    highlight: textmate
  1. Ejecutar el comando:
rmarkdown::render_site()

Luego de este paso, su página web estará lista para el deployment, en su working directory.

6.2 Subir a GitHub

Github Pages es una platforma que facilita el desarrollo e hosting de Páginas Web Estáticas.

  1. Crear una branch gh-pages en su repositorio. A este branch subir: los .Rmd, _site.yml, y los archivos generado por el render (del paso 3).

  2. Activar el servicio Github Pages: Settings -> Options.

  3. Seleccionar la branch gh-pages.

La página podrá ser accedida por:

https://{Tu-Usuario}.github.io/{Nombre-de-Repository}/

7 R Markdown Cheatsheet

Aquí puedes encontrar un resumen y esquema de RMarkdown, para facilitar la programación.

Aquí hay otro buen resumen, en español.