0Pricing
R Academy · Lezione

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.R

setwd(): 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 automatically

file.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 lavoro
  • file.path('a', 'b', 'c.csv') — costruire percorsi portabili tra sistemi operativi
  • normalizePath(path, mustWork = FALSE) — risolvere in un percorso assoluto
  • dirname() / basename() — separare il percorso in cartella e file
  • file.exists() — verificare l'esistenza prima della lettura
  • Sys.getenv('HOME') — accedere ai percorsi di sistema tramite variabili d'ambiente
  • path.expand('~') — espandere la tilde nella directory home
  • list.files(pattern = '\.csv$') — trovare i file in base all'estensione
  • dir.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

  1. Uso di source() per caricare gli script
  2. Commenti, stile e leggibilità
  3. Directory di lavoro e percorsi dei file
  4. Progetti R e gestione dell'area di lavoro
← Torna a R Academy