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:

kelvin_a_centigrados <- function(temperatura) {
  
  return(temperatura - 273.15)
  
}

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.

Ejercicio

Primer desafío: Crea una función

  1. Creá un archivo .R con alguna función. Puede ser la que vimos como ejemplo o alguna otra que prefieras.
  2. Guardá el archivo en la carpeta scripts

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"))
Ejercicio

Segundo desafío: Carga la función

  1. Agrega source(here::here("scripts/funciones_secundarias.R")) al comienzo del archivo .Rmd
  2. Usa la función en algún bloque de código
  3. Knitea el archivo para ver el resultado final

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():

descarga_pinguinos <- function() {
  file <- here::here("datos/datos_crudos/penguins.csv")
  url <- "https://sandbox.zenodo.org/record/1029654/files/penguins.csv?download=1"
  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:

datos_pinguinos <- function() {
  file <- here::here("datos/datos_crudos/penguins.csv")
  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.

penguins <- datos_pinguinos()
Ejercicio

Tercer desafío: descarga de datos programática

  • Siguiendo los pasos anteriores, general las funciones necesarias para descargar los datos prográtiacamente en la carpeta correcta.
  • Las funciones pueden estar al comienzo del archivo o puedes guardarlas en el script funciones_secundarias.R (o un nuevo script) y cargarlas al comienzo.
  • Para revisar que todo funciona, knitea el archivo y chequea que los datos estén en la carpeta correcta.