Menu

Directorio de trabajo en R: setwd(), getwd() y limpiar el espacio de trabajo

Dónde busca R los archivos y cómo controlarlo: getwd(), setwd(), list.files(), limpiar el entorno con rm(list = ls()) y por qué el autoguardado de .RData es una trampa.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Qué es el directorio de trabajo

Toda sesión de R se ejecuta "dentro de" exactamente una carpeta: el directorio de trabajo. Siempre que usas una ruta relativa - una ruta que no empieza en la raíz del sistema de archivos -, R la resuelve respecto a esa carpeta. read.csv("data.csv") no significa "encuentra data.csv en algún lugar de mi ordenador"; significa "abre el archivo llamado data.csv en el directorio de trabajo".

Este único hecho explica el error de principiante más común de R:

read.csv("data.csv")
# Error in file(file, "rt") : cannot open the connection
# In addition: Warning message: cannot open file 'data.csv': No such file or directory

El archivo existe - simplemente no en la carpeta que R está mirando ahora mismo. Tu llamada a read.csv no tiene nada de malo; lo que no coincide es el directorio de trabajo de la sesión con la ubicación del archivo. Las dos funciones de abajo convierten eso de un misterio en un diagnóstico de diez segundos.

getwd() y setwd()

getwd() (get working directory) te dice dónde está mirando R ahora mismo:

Ejecútalo y verás una ruta absoluta - la carpeta a la que está anclada esta sesión. setwd() (set working directory) la cambia:

setwd("C:/Users/rosa/projects/sales-analysis")   # Windows: use / not \
setwd("/Users/rosa/projects/sales-analysis")     # macOS / Linux
getwd()                                          # confirm it took

Dos notas mecánicas. En Windows, escribe las rutas con / (o con \\ duplicada) - una sola \ es un carácter de escape dentro de las cadenas de R, así que "C:\Users" es un error de sintaxis. Y setwd() da error de inmediato si la carpeta no existe, que es el fallo más amable que te encontrarás en todo el día: no puede dejarte apuntando en silencio al sitio equivocado.

La rutina de depuración para cualquier error de "cannot open file" es por tanto: getwd() para ver dónde está mirando R y luego compararlo con dónde vive realmente el archivo.

list.files(): ver lo que ve R

La tercera herramienta del kit lista el contenido del directorio de trabajo - literalmente el conjunto de nombres al que puede llegar una ruta relativa:

Si el archivo que intentas leer aparece en esa salida, read.csv("esearchivo.csv") lo encontrará. Si no aparece, por mucho que vuelvas a teclear la línea de read.csv no servirá de nada - lo que hay que arreglar es el directorio de trabajo. list.files("data") echa un vistazo a una subcarpeta y list.files(pattern = "\\.csv$") filtra solo los CSV. Cuando un nombre de archivo parece correcto pero no se encuentra, list.files() también deja al descubierto a los culpables clásicos: una extensión .txt invisible añadida por un editor de texto, o Data.csv frente a data.csv en un sistema que distingue mayúsculas.

Por qué se rompe un setwd() fijo

Ahora la parte con opinión. Verás scripts que empiezan con:

setwd("C:/Users/me/Desktop/stuff/project3/final_FINAL")

Esa línea funciona en exactamente una máquina: la del autor. En tu portátil, en el Mac de tu compañera, en el servidor del departamento o en tu propio ordenador después de una reorganización, falla en la línea 1. Fijar una ruta absoluta empotra la organización de carpetas de una persona en un código pensado para sobrevivirla.

La solución es invertir la responsabilidad: no hagas que el script encuentre la carpeta - inicia R en la carpeta correcta y usa rutas relativas dentro del script. En concreto:

  • Usa Proyectos de RStudio. Abrir un archivo .Rproj establece el directorio de trabajo en la carpeta del proyecto automáticamente, en cualquier máquina. Dentro del script, read.csv("data/sales.csv") funciona entonces para todo el que tenga el proyecto.
  • Ejecutar desde un terminal hace el mismo trabajo: Rscript analysis.R usa como directorio de trabajo la carpeta desde la que lo lanzas (mira ejecutar scripts de R).
  • El paquete here va un paso más allá para quien lo quiera - here::here("data", "sales.csv") construye rutas desde la raíz del proyecto sin importar por dónde haya vagado el directorio de trabajo -, pero los Proyectos más las rutas relativas cubren la mayoría de necesidades sin él.

setwd() en sí no es el diablo - está bien de forma interactiva, mientras exploras. El olor es específicamente un setwd() absoluto y específico de una máquina confirmado al principio de un script compartido.

El espacio de trabajo: ls() y rm()

Junto al "en qué carpeta estoy" está la segunda pieza del estado de la sesión: el espacio de trabajo (el entorno global) - todos los objetos que has creado en esta sesión. ls() los lista y rm() los elimina:

El último ls() imprime character(0) - un espacio de trabajo vacío. El conjuro rm(list = ls()) se lee raro hasta que lo desglosas: ls() devuelve el vector de caracteres con todos los nombres de objeto, y rm(list = ...) borra todos los nombres de ese vector. Es el equivalente en código al icono de la escoba del panel Environment de RStudio.

Ten claro lo que no hace: los paquetes cargados con library() siguen cargados, las opciones siguen fijadas y el directorio de trabajo se queda donde está. Limpia objetos, nada más - así que no sustituye a reiniciar R cuando quieres una pizarra realmente limpia.

Limpiar la consola y la trampa del .RData

Limpiar la consola - el historial de comandos y salidas - es cosmético y algo distinto de limpiar el espacio de trabajo. En RStudio es Ctrl+L; en código, el peculiar cat("\014") envía el carácter de avance de página, que la mayoría de las consolas interpretan como "limpia la pantalla". Ninguno de los dos toca tus objetos.

Por último, la trampa. Cuando sales de R te ofrece "save workspace image?" - escribir todos los objetos en un archivo oculto .RData que se recarga en silencio la próxima vez que arranques R en esa carpeta. Recházalo y desactívalo permanentemente (RStudio: Tools → Global Options → desmarca "Restore .RData" y pon "Save workspace" en Never). Un espacio de trabajo restaurado significa que tu sesión empieza contaminada con objetos de hace días, creados por código que puede que hayas editado o borrado desde entonces. Tu script parece funcionar - porque se apoya en un model_v2 rancio que ya nada en el archivo crea - hasta el momento en que se ejecuta en una máquina limpia y se desmorona.

El hábito profesional es el contrario: empieza limpio y vuelve a ejecutar el script. Si tu análisis es un script que se ejecuta de arriba abajo en una sesión nueva, es reproducible por construcción; el espacio de trabajo es salida desechable, nunca un estado valioso. Reinicia R a menudo (RStudio: Session → Restart R) precisamente para demostrar que tu script sigue sosteniéndose solo.

Lo que te llevas

  • Las rutas relativas se resuelven respecto al directorio de trabajo; getwd() lo muestra, setwd() lo cambia y list.files() muestra qué es alcanzable.
  • "Cannot open file" casi siempre significa que el directorio de trabajo y la carpeta del archivo no coinciden - diagnostícalo con getwd() + list.files().
  • Nunca confirmes un setwd() absoluto en un script compartido - usa Proyectos de RStudio (o ejecuta el script desde su carpeta) y rutas relativas.
  • ls() lista los objetos del espacio de trabajo; rm(x) elimina uno; rm(list = ls()) los borra todos - los paquetes y las opciones se quedan.
  • Ctrl+L (o cat("\014")) limpia únicamente el texto de la consola.
  • No autoguardes ni restaures .RData: empieza limpio y vuelve a ejecutar el script - eso es lo que hace reproducible tu trabajo.

Lo siguiente: leer datos reales - read.csv() y compañía, ahora que R está mirando en la carpeta correcta para encontrarlos.

Preguntas frecuentes

¿Cómo establezco el directorio de trabajo en R?

Llama a setwd("ruta/a/la/carpeta") para cambiarlo y a getwd() para ver el actual. En RStudio también puedes usar el menú: Session → Set Working Directory. Pero para cualquier cosa que vayas a reejecutar o a compartir, prefiere un Proyecto de RStudio (que establece el directorio de trabajo automáticamente) antes que una línea setwd() fija - las rutas absolutas se rompen en cualquier otra máquina.

¿Cómo limpio el entorno en R?

rm(list = ls()) elimina todos los objetos del entorno global: ls() lista todos los nombres de objeto y rm() los borra. Para eliminar solo uno, usa rm(x). Ten en cuenta que esto solo limpia objetos - los paquetes cargados siguen cargados y el texto de la consola no se toca (eso es Ctrl+L en RStudio).

¿Por qué read.csv dice 'cannot open file' si el archivo existe?

Porque R resuelve las rutas relativas respecto a su directorio de trabajo, y el tuyo apunta a un sitio distinto de la carpeta que contiene el archivo. Ejecuta getwd() para ver dónde está mirando R y list.files() para ver qué puede ver allí. Arréglalo abriendo el proyecto en la carpeta correcta (o con setwd()), no pegando una ruta absoluta en el script.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR