Menu

Directory di lavoro in R: setwd(), getwd() e pulire il workspace

Dove R cerca i file e come controllarlo: getwd(), setwd(), list.files(), pulire l'ambiente con rm(list = ls()) e perché il salvataggio automatico di .RData è un tranello.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Cos'è la directory di lavoro

Ogni sessione di R gira "dentro" esattamente una cartella: la directory di lavoro. Ogni volta che usi un percorso relativo, cioè un percorso che non parte dalla radice del filesystem, R lo risolve a partire da quella cartella. read.csv("data.csv") non significa "trova data.csv da qualche parte sul mio computer"; significa "apri il file chiamato data.csv nella directory di lavoro".

Questo solo fatto spiega l'errore più comune di chi inizia con 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

Il file esiste, solo che non si trova nella cartella in cui R sta guardando in quel momento. Non c'è nulla di sbagliato nella tua chiamata a read.csv: la directory di lavoro della sessione e la posizione del file non coincidono. Le due funzioni qui sotto trasformano questo mistero in una diagnosi di dieci secondi.

getwd() e setwd()

getwd() (get working directory) ti dice dove sta cercando R in questo momento:

Eseguilo e vedrai un percorso assoluto: la cartella a cui è ancorata questa sessione. 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

Due note pratiche. Su Windows scrivi i percorsi con / (o con \\ doppio): un singolo \ è un carattere di escape nelle stringhe di R, quindi "C:\Users" è un errore di sintassi. E setwd() dà subito errore se la cartella non esiste, che è il fallimento più gentile che incontrerai in tutta la giornata: non può lasciarti puntato in silenzio nel posto sbagliato.

La routine di debug per qualsiasi errore "cannot open file" è quindi: getwd() per vedere dove sta cercando R, poi confrontarlo con il posto in cui si trova davvero il file.

list.files(): guarda quello che vede R

Il terzo strumento del kit elenca il contenuto della directory di lavoro, cioè letteralmente l'insieme dei nomi che un percorso relativo può raggiungere:

Se il file che stai cercando di leggere compare in quell'output, read.csv("thatfile.csv") lo troverà. Se non c'è, riscrivere la riga di read.csv non servirà a niente: è la directory di lavoro che va sistemata. list.files("data") dà un'occhiata dentro una sottocartella, e list.files(pattern = "\\.csv$") filtra solo i CSV. Quando un nome di file sembra giusto ma non viene trovato, list.files() mette in luce anche i colpevoli classici: un'estensione .txt invisibile aggiunta da un editor di testo, oppure Data.csv contro data.csv su un sistema che distingue le maiuscole.

Perché un setwd() scritto a mano si rompe

Ora la parte con un'opinione precisa. Vedrai script che iniziano così:

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

Quella riga funziona esattamente su una macchina: quella dell'autore. Sul tuo portatile, sul Mac di un collega, sul server del dipartimento o sul tuo stesso computer dopo aver riorganizzato le cartelle, dà errore alla riga 1. Scrivere a mano un percorso assoluto incolla l'organizzazione delle cartelle di una persona dentro un codice pensato per sopravviverle.

La soluzione è invertire la responsabilità: non far cercare la cartella allo script, avvia R nella cartella giusta e usa percorsi relativi dentro lo script. In concreto:

  • Usa i progetti RStudio. Aprire un file .Rproj imposta automaticamente la directory di lavoro sulla cartella del progetto, su qualsiasi macchina. Dentro lo script, read.csv("data/sales.csv") funziona allora per chiunque abbia il progetto.
  • Eseguire da un terminale fa lo stesso lavoro: Rscript analysis.R usa come directory di lavoro la cartella da cui lo lanci (vedi eseguire script R).
  • Il pacchetto here fa un passo in più per chi lo vuole: here::here("data", "sales.csv") costruisce i percorsi dalla radice del progetto ovunque sia finita la directory di lavoro, ma progetti più percorsi relativi coprono la maggior parte delle esigenze anche senza.

setwd() di per sé non è il male: va benissimo in modo interattivo, mentre esplori. Il cattivo segnale è specificamente un setwd() assoluto, legato a una macchina, salvato in cima a uno script condiviso.

Il workspace: ls() e rm()

Accanto a "in che cartella sono" c'è il secondo pezzo di stato della sessione: il workspace (l'ambiente globale), cioè tutti gli oggetti che hai creato in questa sessione. ls() li elenca, rm() li rimuove:

L'ultimo ls() stampa character(0): un workspace vuoto. La formula rm(list = ls()) sembra strana finché non la scomponi: ls() restituisce il vettore di caratteri con i nomi di tutti gli oggetti, e rm(list = ...) cancella ogni nome di quel vettore. È l'equivalente in codice dell'icona con la scopa nel pannello Environment di RStudio.

Sappi cosa non fa: i pacchetti caricati con library() restano caricati, le opzioni restano impostate e la directory di lavoro non si sposta. Pulisce gli oggetti e nient'altro, quindi non sostituisce il riavvio di R quando vuoi ripartire davvero da zero.

Pulire la console, e il tranello di .RData

Pulire la console, cioè lo storico di comandi e output, è una questione estetica e separata dal pulire il workspace. In RStudio si fa con Ctrl+L; nel codice, lo strano cat("\014") invia il carattere di avanzamento pagina, che la maggior parte delle console interpreta come "pulisci lo schermo". Nessuno dei due tocca i tuoi oggetti.

Infine, il tranello. Quando chiudi R ti propone "save workspace image?", cioè di scrivere tutti gli oggetti in un file nascosto .RData che si ricarica in silenzio la volta successiva che avvii R in quella cartella. Rifiuta, e disattivalo per sempre (RStudio: Tools → Global Options → togli la spunta a "Restore .RData", imposta "Save workspace" su Never). Un workspace ripristinato significa che la tua sessione parte inquinata da oggetti di giorni prima, creati da codice che nel frattempo potresti aver modificato o cancellato. Lo script sembra funzionare, perché si appoggia a un vecchio model_v2 che ormai nessuna riga del file crea più, fino al momento in cui gira su una macchina pulita e crolla.

L'abitudine professionale è l'opposto: parti puliti e riesegui lo script. Se la tua analisi è uno script che gira dall'inizio alla fine in una sessione nuova, è riproducibile per costruzione; il workspace è un output usa e getta, mai uno stato prezioso. Riavvia R spesso (RStudio: Session → Restart R) proprio per dimostrare che il tuo script sta ancora in piedi da solo.

Cosa ti porti a casa

  • I percorsi relativi si risolvono a partire dalla directory di lavoro; getwd() la mostra, setwd() la cambia, list.files() mostra cosa è raggiungibile.
  • "Cannot open file" significa quasi sempre che la directory di lavoro e la cartella del file non coincidono: fai la diagnosi con getwd() + list.files().
  • Non salvare mai un setwd() assoluto in uno script condiviso: usa i progetti RStudio (o esegui lo script dalla sua cartella) e percorsi relativi.
  • ls() elenca gli oggetti del workspace; rm(x) ne rimuove uno; rm(list = ls()) li cancella tutti, mentre pacchetti e opzioni restano.
  • Ctrl+L (o cat("\014")) pulisce solo il testo della console.
  • Non salvare e ripristinare automaticamente .RData: parti puliti e riesegui lo script, è questo che rende riproducibile il tuo lavoro.

Prossimo passo: leggere dati reali con read.csv() e simili, ora che R cerca nella cartella giusta per trovarli.

Domande frequenti

Come si imposta la directory di lavoro in R?

Chiama setwd("path/to/folder") per cambiarla e getwd() per vedere quella corrente. In RStudio puoi usare anche il menu: Session → Set Working Directory. Ma per tutto ciò che rieseguirai o condividerai, preferisci un progetto RStudio (che imposta la directory di lavoro in automatico) a una riga setwd() scritta a mano: i percorsi assoluti si rompono su qualsiasi altra macchina.

Come si pulisce l'ambiente in R?

rm(list = ls()) rimuove tutti gli oggetti dall'ambiente globale: ls() elenca i nomi di tutti gli oggetti e rm() li cancella. Per rimuovere un solo oggetto, usa rm(x). Nota che pulisce solo gli oggetti: i pacchetti caricati restano caricati e il testo della console non viene toccato (per quello c'è Ctrl+L in RStudio).

Perché read.csv dice 'cannot open file' quando il file esiste?

Perché R risolve i percorsi relativi a partire dalla sua directory di lavoro, e la tua punta da qualche parte diversa dalla cartella che contiene il file. Esegui getwd() per vedere dove sta cercando R e list.files() per vedere cosa vede lì. Risolvi aprendo il progetto nella cartella giusta (o con setwd()), non incollando un percorso assoluto nello script.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA