<- function(temperatura) {
kelvin_a_centigrados
return(temperatura - 273.15)
}
Flujo de trabajo
Esta temática podría ser tan larga y compleja como se quiera. Definir manera de trabajar es cuestión de práctica pero además del objetivo final que queremos alcanzar. En esta sección veremos algunas herramientras y discutiremos algunas ideas que buscan seguir avanzando en la generaciónde analísis y reportes reproducibles.
Trabajando con funciones y otro código
Hasta ahora tenemos un proyecto con una determinada estructura de carpetas que nos permite ordenar nuestro trabajo. Además vimos en detalle como utilizar archivos .Rmd o .qmd autocontenidos, que incluyan el código y texto necesario para generar un análisis. Pero es posible que nuestro trabajo necesite funciones que generamos para hacer nuestro trabajo más simple. Si incluimos el código que define estas funciones en nuestro .Rmd, puede complejizar nuestro código y que sea más dificil de interpretar. Aquí podemos comenzar a incluir archivos secundarios que contengan estas funciones.
En las situaciones donde nuestro código no produce resultados, más bien son definiciones de funciones secundarias u otras herramientras, no tiene tanto sentido usar archivos .Rmd. En estos casos podemos volver a los tradicionales scripts.
Si hipotéticamente quisieramos definir una función que convierte la temperatura en kelvin (algo muy común entre meteorólogos) a la temperatura en grados centígrados tendriamos el siguiente código:
que podríamos guardar en un script de R que se llame funciones_secundarias.R
que por supuesto guardaremos en la carpeta “scripts”. Aquí podemos hacer un paréntesis para mencionar la necesidad de documentar apropiadamente cualquier función o código que generemos. Para una función deberíamos incluir:
Qué hace o cual es su propósito.
Qué argumentos requiere y de que tipo de datos son.
Qué genera cómo resultado.
Ahora el desafío es lograr usar esa función que está en un archivo .R en el reporte .Rmd. Necesitamos cargar el script al comienzo de nuestro archivo para que la función quede disponible para ser utilizada más adelante.
El mejor lugar para hacer esto es, en el caso de R Markdown, el bloque de código setup donde además cargamos las librerías que usaremos. Por ejemplo:
library(ggplo2)
library(data.table)
source(here::here("scripts/funciones_secundarias.R"))
Trabajando con datos
Muchas veces los datos están disponibles en distintos servicios en páginas de internet. Muchos gobiernos por ejemplo, tienen portales de datos abiertos. Organizaciones generan APIs para poner a disposición sus datos o tal vez otras personas publicaron sus datos en servicios como Zenodo y queremos aprovecharlos. Es posible que se puedan decargar los datos visitando la web y haciendo click en un botón, sin embargo podríamos escribir el código necesario para hacer esto de manera programática. Esto hace que nuestro trabajo sea más reproducible y disminuye las chances de error.
El código que genera la descarga de datos podría estar incluido en el archivo .Rmd si la descarga no demora. En general querremos incluir la opción de no descargar los datos si el código encuentra que ya fueron descargados previamente. También podríamos generar un script de descarga de datos que corra una sola vez. Esta es una buena idea cuando el código de descarga demora o es complejo.
Veamos un ejemplo de descarga de datos desde Zenodo.
Si revisamos la base de datos https://sandbox.zenodo.org/record/1029654 veremos que incluye un solo archivo en formato .csv.
Vemos también el botón “Download” para la descarga del archivo. Podríamos usarlo para descargar el archivo haciendo click.
Pero como mencionaba previamente, se puede escribir el código necesario para hacer la descarga de manera programática y asegurarnos que tenemos los datos correctos. Podríamos crear una función descarga_pinguinos()
:
<- function() {
descarga_pinguinos <- here::here("datos/datos_crudos/penguins.csv")
file <- "https://sandbox.zenodo.org/record/1029654/files/penguins.csv?download=1"
url download.file(url, file)
}
Para obtener la dirección url del archivo, hay que hacer click derecho sobre el botón Download y copiar el link.
Ahora si deseas descargar los datos solo hay que llamar a la función descarga_pinguinos()
y los datos se guardaran en la carpeta correcta.
Podríamos mejorar esto generando una función que solo descargue los datos en caso de que no estén presentes en el proyecto. Esta función podría escribirse de esta manera:
<- function() {
datos_pinguinos <- here::here("datos/datos_crudos/penguins.csv")
file if (!file.exists(file)) {
descarga_pinguinos()
} return(read.csv(file))
}
Con esta última función en nuestro archivo .Rmd nos podemos olvidar de la descarga de datos, que se hará automáticamente.
<- datos_pinguinos() penguins