Un proyecto en R: cómo no perderse en tu propio código
El problema: rutas absolutas y otros suicidios
Antes de hablar de soluciones, mira el código que escribe alguien que aprendió R por su cuenta sin estructura:
setwd("C:/Users/Alex/Desktop/Tesis/Datos finales (corregidos)/v3")
df <- read.csv("ventas_2024.csv")
write.csv(df_filtrado, "C:/Users/Alex/Desktop/Tesis/Datos finales (corregidos)/v3/output/resultados.csv")Cada error aquí es invisible cuando funciona y devastador cuando no:
setwd()con ruta absoluta. Funciona solo en TU máquina. Si compartes el script o lo abres desde otro PC, falla.- Rutas duplicadas en el código. Si renombras “Datos finales (corregidos)” a “datos”, tienes que cambiarlo en N sitios.
- No hay distinción entre input, output y código. Todo en la misma carpeta. En seis meses no sabrás qué archivo generó qué.
La solución no es escribir mejor estas líneas. Es no necesitarlas.
La solución: el RStudio project
Un RStudio project es un archivo .Rproj que vive en una carpeta y le dice a RStudio: “esta es la raíz de un proyecto”. Cuando lo abres:
- RStudio establece el working directory automáticamente en esa carpeta.
- Las rutas relativas (
data/ventas.csv) funcionan sinsetwd(). - Tienes un entorno limpio al abrir (sin variables fantasma de sesiones previas).
Crear uno:
File → New Project → New Directory → New Project
Elige una carpeta razonable (no en el Escritorio. Idealmente dentro de Documents/R/ o donde mantengas tu trabajo). Pon un nombre sin espacios ni acentos.
Resultado: una carpeta con un único archivo mi_proyecto.Rproj dentro. Esa es tu raíz.
Una estructura que escala
Dentro de la carpeta del proyecto, crea estas subcarpetas:
mi_proyecto/
├── mi_proyecto.Rproj
├── data/ # datos crudos — NUNCA tocar a mano
│ └── ventas_2024.csv
├── data-derived/ # datos procesados, regenerables desde scripts
├── scripts/ # código R
│ ├── 01_limpieza.R
│ ├── 02_modelo.R
│ └── 03_figuras.R
├── output/ # figuras, tablas, informes generados
│ └── figuras/
├── README.md # qué hace este proyecto y cómo se ejecuta
└── .gitignore # qué no versionar (data-derived/, output/)
Las claves de la convención:
data/ydata-derived/separadas. Los crudos nunca se modifican: cualquier transformación va adata-derived/. Si pierdesdata-derived/, lo regeneras corriendo los scripts. Si pierdesdata/, has perdido datos de verdad.- Scripts numerados. El número refleja el orden de ejecución, no la importancia. Te ayuda al volver al proyecto en seis meses.
README.mddescribe qué hace el proyecto y, sobre todo, cómo se reproduce. Sin README, tu yo del futuro lo va a sufrir..gitignoreevita versionar lo que se regenera. Cuando lleguemos a la ruta de Quarto / git veremos esto en detalle.
here::here(): la cura del /data vs data
Cuando un script de scripts/ quiere leer data/ventas.csv, escribir read_csv("data/ventas.csv") puede funcionar o no, según desde dónde estés ejecutando:
- Si el working directory es la raíz del proyecto: funciona.
- Si por alguna razón es
scripts/(te pasó al copiar código de otro sitio): falla concannot open file.
El paquete here resuelve esto definitivamente:
install.packages("here")
library(here)
library(readr)
df <- read_csv(here("data", "ventas_2024.csv"))here() localiza la raíz del proyecto (busca el archivo .Rproj subiendo por el árbol de carpetas) y construye la ruta desde ahí. Da igual desde qué subcarpeta ejecutes el script: la ruta siempre se resuelve correctamente.
Adóptalo desde el primer día. Es la diferencia entre código portable y código que “funciona porque sí”.
Un script de “hola mundo”
Crea scripts/00_setup.R con esto:
library(tidyverse)
library(here)
message("Proyecto en: ", here())
message("R ", R.version.string)
message("tidyverse ", as.character(packageVersion("tidyverse")))Ejecuta con Ctrl+Shift+Enter (Cmd+Shift+Enter en macOS). Deberías ver tres líneas con la ruta de tu proyecto, la versión de R y la de tidyverse.
Si funciona, tu proyecto está vivo.
Trampas habituales
- Crear proyectos dentro de OneDrive/Dropbox/iCloud. Funciona, pero a veces los servicios de sincronización bloquean archivos durante una escritura y tu script falla con
permission denied. Si trabajas con datasets que cambian rápido, considera tener los proyectos en un disco local (Documents/R/fuera de OneDrive). - Nombres con espacios o acentos. R los acepta, pero algunas herramientas auxiliares (git, comandos en terminal, parquet) sufren. Convención: minúsculas, guiones bajos o medios, sin acentos.
- Mezclar
setwd()y proyectos. Si abres un.Rprojy luego hacessetwd()a otra carpeta, anulas la ventaja entera. No lo hagas. Si necesitas leer datos fuera del proyecto, usa rutas absolutas explícitas confile.path(), pero nunca muevas el working directory.
En la siguiente entrega
Ya tienes proyecto. Ahora vamos a empezar a escribir código de verdad. El primer concepto que conviene interiorizar antes de tocar dplyr es el pipe: el operador que cambia por completo cómo se lee R. Es lo siguiente.