Directory di lavoro e percorsi dei file
Usi getwd(), setwd() e here() per ottenere percorsi affidabili e multipiattaforma.
Directory di lavoro e percorsi dei file è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento R Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso R Academy include 4 lezioni in totale.
Che cos'è la directory di lavoro?
La directory di lavoro è la cartella che R usa come punto di partenza quando si fa riferimento a file tramite percorsi relativi. È la posizione predefinita in cui R cerca i file e li scrive quando non viene fornito un percorso completo. Ogni sessione R ha esattamente una directory di lavoro in ogni momento.
# getwd() returns the current working directory
current_dir <- getwd()
cat('Working directory:', current_dir)
# All relative file references start from this location:
# read.csv('data.csv') <- looks in current_dir/data.csv
# source('R/helpers.R') <- looks in current_dir/R/helpers.Rsetwd(): cambiare la directory di lavoro
setwd() cambia la directory di lavoro per la sessione R corrente. Restituisce in modo invisibile la precedente directory di lavoro, utile per ripristinare lo stato. Nota: l'uso di setwd() negli script è sconsigliato nei flussi di lavoro basati sui progetti.
# Set a new working directory
old_dir <- setwd('/tmp')
cat('Now in:', getwd(), '\n')
# Restore original directory
setwd(old_dir)
cat('Restored to:', getwd(), '\n')
# Common anti-pattern (breaks on other machines):
# setwd('/Users/alice/Desktop/my_project') <- hardcoded!
# Better: use RStudio Projects which set wd automaticallyfile.path(): creare percorsi portabili
file.path() costruisce percorsi di file unendo i componenti con il separatore corretto per il sistema operativo (/ su Mac/Linux, \ su Windows). Lo usi sempre al posto della concatenazione di stringhe per garantire la compatibilità multipiattaforma.
# Build a path from components
data_path <- file.path('data', 'raw', 'sales.csv')
cat('Path:', data_path)
# On Unix: data/raw/sales.csv
# On Windows: data\raw\sales.csv
# Multiple levels
output_file <- file.path('output', '2024', 'Q1', 'report.pdf')
cat('Output:', output_file)
# Combine with getwd() for a full absolute path
full_path <- file.path(getwd(), 'data', 'sales.csv')
cat('Full path:', full_path)normalizePath(): risolvere un percorso assoluto
normalizePath() converte un percorso relativo nella sua forma assoluta canonica, risolvendo i componenti . (directory corrente) e .. (directory genitore). È essenziale quando deve memorizzare o registrare una posizione di file non ambigua.
# Resolve relative paths to absolute
abs_path <- normalizePath('.')
cat('Absolute cwd:', abs_path, '\n')
# Resolve a relative path
data_abs <- normalizePath(file.path('..', 'data', 'sales.csv'),
mustWork = FALSE)
cat('Resolved:', data_abs, '\n')
# mustWork = FALSE: do not error if file does not exist yet
# mustWork = TRUE (default): error if path does not exist
# Useful for building reliable log messages or config files
cat('normalizePath demo complete')dirname() e basename()
dirname() estrae la parte relativa alla directory di un percorso, mentre basename() estrae la parte relativa al nome del file. Sono gli equivalenti R dei comandi shell Unix dirname e basename.
path <- '/Users/alice/projects/analysis/data/sales_2024.csv'
# Extract the directory
folder <- dirname(path)
cat('Directory:', folder, '\n')
# /Users/alice/projects/analysis/data
# Extract the file name
filename <- basename(path)
cat('File name:', filename, '\n')
# sales_2024.csv
# Remove file extension
name_only <- tools::file_path_sans_ext(filename)
cat('Name only:', name_only)file.exists(): controllare prima della lettura
Controlli sempre se un file esiste prima di provare a leggerlo, per evitare messaggi di errore criptici. file.exists() restituisce TRUE o FALSE e funziona sia sui file sia sulle directory.
data_file <- file.path('data', 'sales.csv')
# Check existence before reading
if (file.exists(data_file)) {
cat('File found, loading...\n')
# df <- read.csv(data_file)
} else {
cat('File not found:', data_file, '\n')
stop('Cannot proceed without data file.')
}
# Check multiple files at once
files <- c('data/a.csv', 'data/b.csv', 'data/c.csv')
exists_vec <- file.exists(files)
cat('Files found:', sum(exists_vec), 'of', length(files))Sys.getenv(): percorsi nelle variabili d'ambiente
Le variabili d'ambiente memorizzano percorsi a livello di sistema, come la directory home, la cartella temporanea e i percorsi personalizzati delle applicazioni. Sys.getenv() legge questi valori, rendendo il codice adattabile a sistemi diversi senza percorsi codificati direttamente.
# Get the home directory
home_dir <- Sys.getenv('HOME')
cat('Home:', home_dir, '\n')
# Get the temp directory
tmp_dir <- Sys.getenv('TMPDIR')
cat('Temp:', tmp_dir, '\n')
# Custom environment variable (set in .Renviron)
data_root <- Sys.getenv('DATA_ROOT', unset = '/default/data')
cat('Data root:', data_root, '\n')
# Use env vars to build portable paths
config_file <- file.path(home_dir, '.config', 'myapp', 'settings.json')
cat('Config path:', config_file)path.expand(): espansione della tilde
La tilde ~ è una forma abbreviata per indicare la directory home nei sistemi Unix-like, ma le funzioni di R per i file non la espandono sempre automaticamente. path.expand() sostituisce ~ con il percorso effettivo della directory home.
# Expand tilde to full home path
short_path <- '~/.Rprofile'
full_path <- path.expand(short_path)
cat('Expanded:', full_path)
# e.g. /Users/alice/.Rprofile
# Useful when passing paths to external tools or logging
config_dir <- path.expand('~/.config/R')
cat('Config dir:', config_dir)
# Can expand multiple paths at once
paths <- c('~/data', '~/output', '~/scripts')
expanded <- path.expand(paths)
cat(expanded, sep = '\n')Elencare i file con list.files()
list.files() (alias dir()) elenca i file in una directory, con la possibilità di filtrarli in base a un modello e di restituire eventualmente i percorsi completi. È indispensabile quando deve elaborare più file in una cartella.
# List all files in current directory
all_files <- list.files('.')
cat('Files found:', length(all_files), '\n')
# Filter by extension
csv_files <- list.files('data', pattern = '\\.csv$', full.names = TRUE)
cat('CSV files:', length(csv_files), '\n')
# Recursive: include subdirectories
r_files <- list.files('R', pattern = '\\.R$',
full.names = TRUE, recursive = TRUE)
cat('R scripts:', length(r_files))Creare e rimuovere percorsi
R dispone di funzioni integrate per creare directory e gestire i file. Usi dir.create() per creare nuove cartelle (con recursive = TRUE per creare percorsi annidati) e file.remove() per eliminare i file temporanei.
# Create a directory (will not error if it already exists)
dir.create('output/figures', recursive = TRUE, showWarnings = FALSE)
cat('Directory created\n')
# Create a temporary file
tmp_file <- tempfile(fileext = '.csv')
write.csv(data.frame(x = 1:3), tmp_file, row.names = FALSE)
cat('Temp file:', tmp_file, '\n')
# Remove the file when done
if (file.remove(tmp_file)) {
cat('Temp file cleaned up')
}Package here: percorsi relativi al progetto
Il package here risolve elegantemente il problema della directory di lavoro. here::here() costruisce sempre percorsi relativi alla radice del progetto, dove si trova il file .Rproj, indipendentemente dal punto del progetto da cui lo si chiama.
# install.packages('here')
# library(here)
# Always resolves from project root:
# here('data', 'raw', 'sales.csv')
# here('R', 'helpers.R')
# here('output', 'report.html')
# Without here: setwd() headaches when script is in a subfolder
# With here: same path works from any subfolder
# Demonstrate base-R equivalent approach:
project_root <- normalizePath(file.path(getwd(), '..'), mustWork = FALSE)
data_path <- file.path(project_root, 'data', 'sales.csv')
cat('Data path:', data_path)Verifica rapida
Disponete della stringa di percorso 'data/raw/../clean/sales.csv'. Quale funzione usereste per risolverla in un percorso assoluto canonico e pulito?
Percorsi dei file — concetti chiave
Una gestione robusta dei percorsi dei file è essenziale per creare script R riproducibili:
getwd()/setwd()— ottenere e impostare la directory di lavorofile.path('a', 'b', 'c.csv')— costruire percorsi portabili tra sistemi operativinormalizePath(path, mustWork = FALSE)— risolvere in un percorso assolutodirname()/basename()— separare il percorso in cartella e filefile.exists()— verificare l'esistenza prima della letturaSys.getenv('HOME')— accedere ai percorsi di sistema tramite variabili d'ambientepath.expand('~')— espandere la tilde nella directory homelist.files(pattern = '\.csv$')— trovare i file in base all'estensionedir.create(recursive = TRUE)— creare in sicurezza directory annidate- Usare il pacchetto here per i percorsi relativi al progetto nei progetti RStudio
# Robust file loading pattern:
data_file <- file.path('data', 'raw', 'sales.csv')
if (!file.exists(data_file)) {
stop(paste('Missing file:', normalizePath(data_file, mustWork = FALSE)))
}
# df <- read.csv(data_file)
cat('File path:', data_file, '\n')
cat('Full path:', normalizePath(data_file, mustWork = FALSE))Domande Frequenti
La lezione «Directory di lavoro e percorsi dei file» è gratuita?
Sì — il testo completo di «Directory di lavoro e percorsi dei file» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso R Academy, passa a CoddyKit PRO. Il corso R Academy include 4 lezioni in totale.
Cosa imparerò in «Directory di lavoro e percorsi dei file»?
Usi getwd(), setwd() e here() per ottenere percorsi affidabili e multipiattaforma. Eserciti R Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare R Academy?
Non è richiesta alcuna esperienza precedente. R Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Directory di lavoro e percorsi dei file»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione R Academy?
Sì. Ogni lezione R Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Uso di source() per caricare gli script
- Commenti, stile e leggibilità
- Directory di lavoro e percorsi dei file
- Progetti R e gestione dell'area di lavoro