Cuando estamos escribiendo un documento en R Markdown, aparte de emplear la sintaxis propia de Markdown podemos también incluir código ejecutable de otros lenguajes, como R, en lo que se llama chunks. Esto sin duda presenta unas ventajas enormes de cara a la replicación de lo que estemos haciendo, ya que al convertirlo a otro formato, como PDF, ese código se ejecutará. Pero también podemos estar interesados en introducir las líneas de un script en R Markdown sin necesidad de ejecutarlo.
Pero si empezamos a escribir mucho código ejecutable, se puede hacer muy complicado localizar las zonas del texto para redactar el documento. Por eso es una práctica habitual escribir el código en otro archivo y luego llamarlo desde R Markdown. Así queda el documento Markdown limpio y bien estructurado.
Sin embargo, si queremos mostrar el código escrito en un script externo en nuestro archivo Markdown para explicar qué hace, tenemos que introducirlo sin que se ejecute. Y aquí es donde nos vamos a centrar. A continuación vamos a ver qué tenemos que hacer para introducir las líneas de un script en R Markdown sin llegar a ejecutarlo.
Quiero leer...
Introducir las líneas de un script en R Markdown
Vamos primero a trabajar con dos archivos que están guardados en la misma carpeta. Un archivo es de R Markdown, llamado text.Rmd
, y un script en R llamado code.R
.
Script code.R
Vamos a ver el contenido del script que hemos llamado code.R
. Si ya habéis navegado por esta web, el código explica cómo conectar MongoDB en R.
mongo( collection = "test", db = "test", url = "mongodb://localhost", verbose = FALSE, options = ssl_options() )
Markdown text.Rmd
El archivo text.Rmd
que contiene nuestro documento de R Markdown.
--- title: "Introducir las líneas de un script en R Markdown sin ejecutarlo" author: "vivaelsoftwarelibre.com" date: "29/4/2020" output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` # Función de conectar MongoDB a R Para conectar MongoDB a R tenemos que emplear la función `mongo()` del paquete `mongolite`. A continuación mostramos un ejemplo de cómo se puede conectar ambos lenguajes: ///// AQUÍ VIENE EL CÓDIGO DEL SCRIPT ///// Como se puede ver en el código anterior...
Como podéis ver, lo que queremos es introducir las líneas de un script en R Markdown. En nuestro caso, queremos introducir las 7 líneas de código del script text.R
en el espacio habilitado en text.Rmd
. Pero es importante puntualizar que no queremos que ese código se ejecute, simplemente que aparezca en ese espacio.
Leer e integrar las líneas del script en .Rmd
Nos estamos aproximando al punto neurálgico. Vamos a sustituir la línea ///// AQUÍ VIENE EL CÓDIGO DEL SCRIPT /////
que está en text.Rmd
por el chunk con el código siguiente:
```{r} script <- readLines("code.R") print(script)
En esa pieza de código de R embebida en R Markdown hemos utilizado la función readLines()
, que requiere introducir la ruta del script. A continuación lo visualizamos con print()
.
El resultado al convertirlo con knit()
a HTML es el siguiente:
Problemas identificados y cómo solucionarlos
De la imagen anterior podemos identificar 4 problemas:
- Aparece el código que se ejecuta para leer las líneas del script.
- Nos aparecen avisos (warnings).
- En el código que se muestra aparecen una doble almohadilla al inicio de cada línea.
- En el código que se muestra cada línea viene dentro de corchetes.
No visualizar el código ejecutado y ocultar las advertencias
Para solventar los dos primeros puntos anteriores, tenemos que editar la primera línea añadiendo dos argumentos al chunk:
echo=FALSE
para que se muestre el resultado de la ejecución del código sin mostrar el código ejecutado.warning=FALSE
para que no se vean las advertencias.
El código con esos problemas resueltos quedaría así:
```{r echo=FALSE, warning=FALSE} script <- readLines("code.R") print(script)
Y cuyo resultado al convertirlo a HTML sería el siguiente:
Estamos ya más cerca, pero aun nos queda visualizar correctamente el script y solucionar los dos últimos puntos.
Eliminar las almohadillas y las comillas cuando introducimos las líneas de un script en R Markdown
Para eliminar las comillas que engloban cada una de las líneas y la doble almohadilla al principio de cada una, añadimos un argumento nuevo al chunk, que es comment=''
. Ahora bien, esta nueva adición funciona correctamente sustituyendo print()
por cat()
. Dentro de esta última función tenemos que añadir cuál es el separador, en este caso sep = '\n'
.
El código final para que quede todo perfecto sería combinar todo lo visto hasta ahora, quedando del siguiente modo:
```{r echo=FALSE, warning=FALSE, comment=''} script <- readLines("code.R") cat(script, sep = '\n')
Ahora si lo convertimos nuevamente a HTML el código del script queda perfectamente integrado en el documento.
De este modo es posible introducir las líneas de un script en R Markdown sin ejecutarlo. Es cierto que el script que hemos empleado podría perfectamente introducirse manualmente en R Markdown sin necesidad de enlazarlo. Pero si tenemos un código más largo, es de extremada utilidad.
Me ha parecido un artículo de lo más interesante. Le será útil a más de uno. Buen trabajo