archivos
[1] "madrid_temperatura-minima" "buenos-aires_temperatura-minima"
[3] "madrid_temperatura-maxima" "buenos-aires_temperatura-maxima"
Imagina que arrancas el cuatrimestre y tenes que continuar con un proyecto de análisis de datos. O mejor te tomaste unas largas vacaciones. Por supuesto, todo el código y los datos están en una única carpeta y además lo publicaste en un repositorio público. Es hora de volver a trabajar, pero ¿qué fue lo último que hiciste? ¿qué falta?.
Empezas a revisar la carpeta del proyecto y encuentras algo así.
/home/dorothy/Documentos/proyecto
├── resumen.R
├── correlation.png
├── datos.csv
├── datos2.csv
├── fig1.png
├── figura2(copy).png
├── figura.png
├── figura1.png
├── figura10.png
├── datos_crudos.csv
├── script.R
└── script_final.R
Y no tienes ni idea por donde arrancar. Hay tres archivos .R
que podrían ser el script con el código que escribiste, varios posibles archivos que contienen algunos “datos” no especificados y un montón de archivos de imagenes con nombres que dan poca información sobre su contenido. Sin un archivo README (documento descriptivo) ni ninguna otra documentación que te ayude a resolver este lío, es muy posible que cueste mucho tiempo volver al punto en el que estabas y continuar con tu trabajo.
Para evitar esta situación necesitamos tener en cuenta la reproducibilidad y el desarrollo de software desde el inicio. La reproducibilidad tiene que ver tanto con las personas que interactúan con el código como con las máquinas que deben ejecutarlo. Hacer que tu código y análisis sea reproducible es permitir que otras personas (y vos en el futuro) puedan revisar, usar y ampliar tu trabajo. Esto requerira aplicar distintos principios de programación y desarrollo de software que veremos a lo largo del curso. Empecemos organizando el trabajo.
Lo que cuenta como “organizado” es muy personal, pero lo principal es que la estructura de carpetas y los nombres de los archivos deben:
Aprovechá carpetas con nombres informativos para autodocumentar las distintas partes de tu análisis.
Coloca tus datos en datos
, los scripts de preprocesamiento en scripts
o preprocesamiento
y tu análisis en analisis
. Utiliza también subcarpetas, como datos/crudos
para guardar los datos originales y datos/derivados
para los datos preprocesados y depurados.
Nombrá tus archivos de modo que puedas saber que incluyen aún si pasaron 10 años desde que los creaste.
Utiliza nombres cortos, descripciones breves de lo que hay dentro.
Describi cuál crees que es el contenido de estos archivos:
datos/crudos/madrid_temperatura-minima.csv
scripts/02_calcula_temperatura-media.R
analysis/01_madrid_temperatura-minima_analisis-estadistico.Rmd
Pensá en buenos nombres de archivos y carpetas para:
un conjunto de datos sobre gatos con columnas para el peso, la longitud, la longitud de la cola, el color o colores del pelaje, el tipo de pelaje y el nombre.
un script que descarga datos de Spotify.
un script que limpia los datos de Spotify.
un script que ajusta un modelo lineal y lo guarda en un archivo.
el archivo .Rds en el que se guarda ese modelo.
Utiliza una estructura de carpetas conocida
No existe una única estructura de carpetas objetivamente mejor. En caso de duda, intenta seguir las convenciones de tu comunidad de investigación. Esto minimizará cualquier fricción entre tú y tu público potencial.
Recuerda siempre que las computadoras son bastante tontas, así que sé amable y utiliza nombres de archivo que puedan entender fácilmente.
En algunos casos, los nombres de archivo con espacios confunden a las computadoras, por lo que en general es mucho más fácil trabajar si los nombres de archivo utilizan guiones para dividir las palabras. Del mismo modo, algunas máquinas no pueden manejar “caracteres especiales” como la “ñ” o las tildes. También es mejor evitar algunos símbolos (“.”, “*”, y otros) porque tienen un significado especial en las expresiones regulares.
Algunos sistemas de archivos no distinguen entre mayúsculas y minúsculas, por lo que Temperatura-Madrid.csv
y temperatura-madrid.csv
pueden ser el mismo archivo.
Para evitar dolores de cabeza, es mejor y por el lado conservador y solo utilizar caracteres latinos en minúsculas, números y guiones (“_” y “-”).
Utiliza guiones como separadores. Puedes utilizar “-” para separar palabras que formen parte del mismo concepto y “_” para separar conceptos. Por ejemplo temperatura-minima_buenos-aires.csv
, en este caso temperatura-minima
es un cocepto y buenos-aires
otro. Recomendamos esta convención y no al revés, porque es compatible con el formato de fecha ISO (“AAAA-MM-DD”).
Si utilizás los separadores de forma coherente e inteligente, podrás analizar los nombres de los archivos como parte de tu código. Por ejemplo, si tienes
archivos
[1] "madrid_temperatura-minima" "buenos-aires_temperatura-minima"
[3] "madrid_temperatura-maxima" "buenos-aires_temperatura-maxima"
También podrías extraer ciudades y nombres de variables desde los nombres de los archivos
strsplit(archivos, "_")
[[1]]
[1] "madrid" "temperatura-minima"
[[2]]
[1] "buenos-aires" "temperatura-minima"
[[3]]
[1] "madrid" "temperatura-maxima"
[[4]]
[1] "buenos-aires" "temperatura-maxima"
Por último, intentá que tus archivos sean fácilmente ordenables. Comezá el nombre del archivo con números (que incluya suficientes ceros a la izquierda) y, si aplica, utilizá fechas en formato AAAA-MM-DD para que el orden de los archivos por nombre coincida con el orden por fecha.
Un aspecto importante a la hora de pensar en tu proyecto es que todos los scripts, datos, figuras y cualquier otra cosa que se necesite para (re)crear el análisis esté dentro de la misma carpeta raíz. De ese modo te aseguras de que lo único que tienes que dar a otra persona para que ejecute correctamente tu código es esa única carpeta. También te facilita la vida si trabajas en el mismo proyecto en distintas computadoras, ya que te permite sincronizar una única carpeta.
Más adelante veremos como empaquetar código para compartirlo con otras personas.
Un paso extra a tener en cuenta es que no puedes hacer que tu trabajo sea portable si tu código no lo es también. Quizás el principal culpable de que el código no sea portable sea utilizar rutas absolutas para manipular archivos en tu código.
La siguiente línea de código lee el archivo datos.csv
:
read.csv("/home/dorothy/Documentos/proyectos/mitrabajo/datos/datos.csv")
Aunque hayas descargado correctamente la carpeta mitrabajo
desde algún repositorio, este código va a dar error porque es poco probable que hayas guardado esa carpeta dentro de Documentos/proyectos
y que tu nombre de usuario en la computadora sea “dorothy”.
En cambio, podes utilizar una ruta relativa:
read.csv("datos/datos.csv")
Esto se ejecutará independientemente de dónde se encuentre la carpeta raíz de tu proyecto ya que hace referencia solo a lo que está adentro. Como veremos a continuación los proyectos de RStudio ayudan a definir cual es la carpeta raíz de manera automática.
RStudio proporciona una forma ordenada y estructurada de separar tus proyectos en diferentes contextos. No ayudan estrictamente a la reproducibilidad del producto final, pero te ayudarán a agilizar tu flujo de trabajo encapsulando cosas como la lista de archivos abiertos, el historial de comandos de R y la configuración de RStudio para cada proyecto.
Abrir un proyecto de RStudio también garantiza que inicies una nueva sesión de R cada vez y establece tu directorio de trabajo en la carpeta raíz del proyecto.
Creá un nuevo proyecto de RStudio
Si todo salió bien, deberías tener una nueva carpeta con el nombre que elejiste para tu proyecto. Es una carpeta común y corriente; lo que la distingue como proyecto de RStudio es el archivo .Rproj, que contiene las opciones de RStudio específicas del proyecto, y la carpeta oculta .Rproj.user, donde se encuentran los archivos temporales específicos del proyecto.
Cada proyecto de RStudio tiene su propio conjunto de opciones que podés cambiar sin alterar las opciones globales ni las de otros proyectos.
La forma más sencilla de abrir un proyecto es abrir la carpeta que lo contiene y hacer doble clic en el archivo .Rproj. También puedes abrir rápidamente un proyecto utilizado recientemente haciendo clic en el icono de proyecto situado a la derecha de la barra de herramientas de RStudio.
Esto abrirá una nueva ventana de RStudio con su propia sesión de R y la carpeta del proyecto será el directorio o carpeta raiz. Por defecto, también abrirá los archivos abiertos anteriormente. Incluso conservará los cambios no guardados. Esto ayuda a mantener tu trabajo ordenado y facilita retomar o compartir lo que has hecho más tarde.
RStudio te permite tener abiertos varios proyectos, y esto es posible porque cada proyecto tiene su propia carpeta. Puedes trabajar con varios proyectos en paralelo sin que el código o los resultados de un análisis interfieran con los de otro.
Abrí tu proyecto
print("Hola!")
o x <- 2 + 2)
, no te olvides de guardarlo.¿Cómo garantizamos que el análisis sea realmente reproducible? Es una pregunta bastante amplia y existen muchas herramientas para resolver este problema. Por ahora vamos a concentrarnos en que, al menos en tu computadora, puedas repetir los cálculos o el análisis desde cero. Y además de organizar los proyectos y no modificar los datos originales, ¿cómo podés asegurarte de guardar todo el código que estuviste usando y genera el análisis? La forma más directa es reiniciar la sesión de R y volver a ejecutar el código, si da un error o no devuelve lo que esperabas significa que te has saltado un paso.
Puedes reiniciar la sesión de R con el atajo de teclado Ctrl+Shif+F10.
Esto puede ocurrir si, por ejemplo, lees datos en memoria ejecutando un comando en la consola. Mientras trabajamos, R tendrá esos datos en memoria y podrás hacer cálculos y gráficos, pero tu código no será reproducible porque le falta el paso importante de leer los datos.
La mejor forma de asegurarte de que esto no ocurra es volver a ejecutar tu código en una sesión nueva de R a menudo, para asegurarte de que tu código es reproducible en cada paso del análisis. Sin embargo, por defecto RStudio guardará el entorno en un archivo oculto llamado .RData y lo restaurará al iniciarse, de modo que los datos seguirán estando en la memoria. Y aunque esto resulta útil para que puedas arrancar tu trabajo exactamente donde lo dejaste cada vez que abras tu proyecto, puede llevar a una situación en la que nunca te des cuenta de que se te pasó guardar una línea de código clave en tu análisis.
Configurá tu proyecto
Ve a “Tools” -> “Project options…”.
En la pestaña “General”
Destildar la opción “Restore .RData into the workspace at startup”
“Save workspace to .RData on exit”: Selecciona “Never” en el menú desplegable
Puedes cambiar estas preferencias a nivel global con “Tools” -> “Global Options” en la sección “General”
Estructura del proyecto - Diapositivas de Danielle Navarro
Empaquetar el trabajo analítico de datos de forma reproducible utilizando R (y amigos)