Para empezar

Usar R y aprovechar las ventajas de un lenguaje para reducir el esfuerzo y automatizar las tareas es uno de los componentes de nuestro método de trabajo. Podemos incorporar análisis y tratamiento de datos o simplemente incluir otros documentos, gráficos o tablas. Como las siguientes:

Figura X. Curva parabólica.
Tabla X. Medias de las variables de estudio por especie.
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa 5.006 3.428 1.462 0.246
versicolor 5.936 2.770 4.260 1.326
virginica 6.588 2.974 5.552 2.026

Los chunks

Te preguntarás ¿pero qué es un chunk? Pues es un trozo de código que escribimos dentro de una “caja”; esencialmente la usaremos para código R pero podríamos incluir diversos lenguajes.

La caja se define mediante una línea de inicio y una de fin:

```{r}
```

Y dentro de ella incluimos el código que deseamos evaluar:

```{r}
 # Las líneas de código (esto es un comentario)
 # ...
```

Calculando con chunks

Veamos un ejemplo, el siguiente chunk:

```{r}
# área y longitud de un círculo (comentario)

radio    <- 5
area     <- pi * radio^2 
longitud <- 2 * pi * radio
area
longitud
```

Si lo incluimos en el texto y tejemos el documento, en el output encontramos:

  1. El contenido del propio chunk, dentro de una caja gris:

    # área y longitud de un círculo
    
    radio    <- 5
    area     <- pi * radio^2 
    longitud <- 2 * pi * radio
    area
    longitud    
  2. Los resultados de la evaluación del código del chunk, en una o más cajas de fondo blanco, una por resultado.

    ## [1] 78.53982
    ## [1] 31.41593

Cálculos en la línea de texto

Además tenemos la opción de escribir código de R dentro de las líneas de texto (in line code), por ejemplo, si incluimos en el texto:

Dado un círculo de radio `r ( radio <- 5 )`,
su área is `r pi * radio^2`.

Que al tejer el documento devuelve:

    Dado un círculo de radio 5, su área es 78.5398163.

Obviamente, para utilizar los chunks a plena potencia es necesario tener experiencia con el lenguaje R, pero podemos utilizar algunas ventajas con unos conocimientos muy básicos.

Llamada al chunk

Para modificar el comportamiento de un chunk cabe añadir en la cabecera, entre las llaves, una serie de elementos: el nombre y los argumentos que definiremos en caso de necesitar alterar el comportamiento prefijado por el sistema.

```{r nonbreChunk, argumento1, argumento2, ...}
# Las líneas de código
# ...
```

Ojo: Los nombres de los chunks* deben ser distintos, pues si se repiten no se tejerá el documento.*

Por defecto, cuando añadimos un chunk vamos a tener, como hemos visto, en el output tanto el código del chunk como los resultados que se obtienen tras la evaluación del código. Es posible que nos interese modificar este comportamiento; los argumentos básicos para modificarlo:

  • echo: Este argumento, determina si se debe incluir el código fuente de R en el archivo de salida. Para evitar que aparezca el código en el texto:

    ```{r, echo=FALSE}
  • eval: Determina si se evalúa el código del chunk. Para que no se evalúe:

    ```{r, eval=FALSE}
  • include: Determina la inclusión del chunk y los resultados en el documento de salida, pero sí evalúa el chunk.

    ```{r, include=FALSE}

Tal y como puedes comprobar en el cheats sheet de R Markdown, existen muchos otros argumentos con distintas utilidades.

Una combinación de los chunks y el código en línea permite realizar una presentación de la información muy “humana”. Por ejemplo, si tenemos el siguiente texto en nuestro documento:

...

```{r, echo=FALSE}
 # área y longitud de un círculo

radio    <- 5
area     <- pi * radio^2 
longitud <- 2 * pi * radio
```

El área de un círculo de `r radio` m radio
es de `r round( area, 2 )` m^2^ y 
su longitud de `r round( longitud, 2 )` m.

Nos devolvería:

    El área de un círculo de 5 m radio es de 78.54 m2 y su longitud de 31.42 m.

Pregunta

Incluyendo texto

Una característica muy interesante de los chunk es su capacidad para incorporar el contenido de un fichero de texto, especialmente, de tipo Rmd. Para ello basta con utilizar el argumento child e indicar el nombre del fichero a incluir.

Por ejemplo, si queremos incluir el contenido del fichero introduccion.Rmd en un texto:

```{r, child="introduccion.Rmd"}
```

A la hora de tejer el documento debe tenerse en cuenta que el contenido de los metadatos del fichero “hijo” son obviados y prevalecen los del documento “padre”.

Podemos utilizar esta opción para crear documentos “maestros” que recojan la información de distintas partes.

<!--Todo nuestro documento esta en distintos ficheros -->

```{r, child="introduccion.Rmd"}
```

```{r, child="metodologia.Rmd"}
```

```{r, child="resultados.Rmd"}
```

```{r, child="discusion.Rmd"}
```

```{r, child="conclusiones.Rmd"}
```

Figuras

Ya hemos visto cómo incluir imágenes en nuestro documento con ayuda de las marcas ![](), ahora vamos a incluir figuras, es decir elementos flotantes gráficos que se describen mediante un pie. Utilizaremos un chunk como instrumento para la inclusión de figuras en el documento.

Los elementos gráficos pueden ser generados directamente por un chunk, como resultado de un código más o menos complejo, o tomarse directamente desde un fichero gráfico.

Usando ficheros gráficos

El chunk toma un fichero gráfico, generalmente es un fichero de imagen (png, jpg, gif, …) pero también puede ser un fichero vectorial (svg, pdf, eps, …), y lo incluye en el output con las condiciones que deseemos.

Los formatos del fichero gráfico dependen del tipo de output elegido, así, para:

  • html: podemos incluir png, jpg, gif, svg, pdf, webp, …

  • pdf: podemos incluir png, jpg, pdf, eps, … pero no gif, ni svg.

En el siguiente ejemplo el chunk toma el fichero rblogges.png. Indicamos el pie de la figura con el argumento fig.caption; la posición, en este caso centrada, con fig.aling que puede tomar los valores: center, left y right; y evitamos que aparezca el código con echo=FALSE. El código de R para incluir una imagen se reduce a la función include_graphics, del paquete knitr.

Ojo: En el presente tipo de documento, por su formato, las figuras no muestran el pie :-( en un PDF sí se mostraría

```{r logoRbloggers, fig.caption="Texto para el pie de la figura", fig.align="center", echo=FALSE}
knitr::include_graphics( "rbloggers.png" )
```

Generando los gráficos con R

R presenta una elevada capacidad y calidad para generar gráficos, en el siguiente ejemplo, repetimos las condiciones fijadas con los argumentos del chunk anterior y utilizamos una función para generar el gráfico como único resultado del mismo.

```{r funcionComplicada, fig.caption="Texto para el pie de la figura", fig.align="center", echo=FALSE}
 # Ejemplo de uso de la función 'persp'
 persp( x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue",
        ltheta = 120, shade = 0.75, ticktype = "detailed",
        xlab = "X", ylab = "Y", zlab = "Sinc( r )" )

```
Texto para el pie de la figura

¿Qué formato elegir?

En la práctica podemos recomendar los siguientes formatos:

  • Imágenes fotográficas: el fichero más adecuado es el jpg.

  • Gráficos: si se utiliza un formato de imagen, preferiblemente deben generarse con el formato png. Una alternativa es utilizar pdf, pero cuando generamos un output HTML el resultado es poco elegante, aunque sí es el ideal para PDF. Otra opción es el formato svg, solo para formato html, no compatible con pdf.

La resolución en los formatos de imagen puede ser muy relevante; a mayor resolución mayor tamaño y por tanto ficheros de output mas grandes. En el caso de documentos que van a papel necesitamos las mejores resoluciones, pero para presentaciones o documentos on line debemos evitar ficheros grandes.

Tablas

Como ya hemos visto, tenemos la posibilidad de generar tablas desde markdown; R nos proporciona varios paquetes especialmente destinados a la elaboración de tablas. Si te vas a enfrentarte con muchas tablas con formatos repetidos y complejos, puede ser el motivo para aprender a usar alguno de estos paquetes. Para los más perezosos siempre está la estrategia de incorporar las tablas, hechas con un programa externo, como sin se tratase de una imagen.

Un ejemplo básico

En el siguiente ejemplo mostramos como se prepara una tabla muy sencilla desde R con la función kable del paquete knitr. Vemos que cabe incluir texto con marcas (cursivas, tachados, …) incluidas las fórmulas.

```{r tablitaKable, fig.caption="Texto para la cabecera de la tabla", echo=FALSE}
# Ejemplo de uso de la función 'kable'
tabla <- read.table( text ='
    enero   31  invierno "economía ~~débil~~, €=$\\frac{1}{\\infty}$"
    febrero 28  invierno "mes *corto*"
    marzo   31  primavera "mejora el ^ti^~em~^po^, a veces"
    abril   30  primavera "mes de las **flores**"'
)
knitr::kable( tabla, col.names = c( "Mes", "Días", "Estación", "Comentario" ) )
```
Mes Días Estación Comentario
enero 31 invierno economía débil, €=\(\frac{1}{\infty}\)
febrero 28 invierno mes corto
marzo 31 primavera mejora el tiempo, a veces
abril 30 primavera mes de las flores

Nota: Cuando se trata de tablas pequeñas se puede hacer como en el ejemplo; sin embargo, lo aconsejable es escribir la tabla en un fichero .txt, .csv o .xls y luego leer ese fichero con la función read.table, read.csv o readxl

Ejemplos avanzados

Pueden generarse tablas muy complejas con la ayuda del paquete kableExtra, puedes saber más sobre él aquí para html o aquí para pdf; como muestra un par de ejemplos:

  1. Agrupando las columnas

    Group 1
    Group 2
    Group 3
    mpg cyl disp hp drat wt
    Mazda RX4 21.0 6 160 110 3.90 2.620
    Mazda RX4 Wag 21.0 6 160 110 3.90 2.875
    Datsun 710 22.8 4 108 93 3.85 2.320
    Hornet 4 Drive 21.4 6 258 110 3.08 3.215
    Hornet Sportabout 18.7 8 360 175 3.15 3.440
  2. Colores y tamaños de letra condicionados

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    5.1 3.5 1.4 0.2 setosa
    4.9 3 1.4 0.2 setosa
    4.7 3.2 1.3 0.2 setosa
    4.6 3.1 1.5 0.2 setosa
    5 3.6 1.4 0.2 setosa
    5.4 3.9 1.7 0.4 setosa
    4.6 3.4 1.4 0.3 setosa
    5 3.4 1.5 0.2 setosa
    4.4 2.9 1.4 0.2 setosa
    4.9 3.1 1.5 0.1 setosa

Pregunta

Resumen

Tenemos alternativas para crear figuras y tablas de alta calidad recurriendo a distintas estrategias. La solución puede estar condicionada con el output deseado.

Queda pendiente etiquetar adecuadamente estos elementos para realizar referencias cruzadas.

editCola: Módulo 3

00Rteam versión: 28/01/20—14:11:26

Volver: al inicio, al módulo 3