R Academy · Lekcja

Katalogi robocze i ścieżki plików

Używaj getwd(), setwd() i here() do tworzenia niezawodnych ścieżek międzyplatformowych.

Lekcja 3 z 413 kroki

Katalogi robocze i ścieżki plików to bezpłatna lekcja R Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.

Czym jest katalog roboczy?

Katalog roboczy to folder, którego R używa jako punktu wyjścia przy odwoływaniu się do plików za pomocą ścieżek względnych. Jest to domyślna lokalizacja, w której R szuka plików (i do której je zapisuje), gdy nie podasz pełnej ścieżki. Każda sesja R ma w danym momencie dokładnie jeden katalog roboczy.

# 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() — zmiana katalogu roboczego

setwd() zmienia katalog roboczy w bieżącej sesji R. Zwraca niewidocznie poprzedni katalog roboczy, co ułatwia przywrócenie wcześniejszego stanu. Uwaga: odradza się używanie setwd() w skryptach w pracy opartej na projektach.

# 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() — tworzenie przenośnych ścieżek

file.path() tworzy ścieżki do plików, łącząc komponenty za pomocą właściwego separatora dla danego systemu operacyjnego (/ na Mac/Linux, \ w systemie Windows). Zawsze używaj tej funkcji zamiast konkatenacji ciągów, aby zapewnić zgodność między platformami.

# 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() — rozwiązywanie do ścieżki bezwzględnej

normalizePath() konwertuje ścieżkę względną do jej kanonicznej postaci bezwzględnej, rozwiązując komponenty . (bieżący katalog) i .. (katalog nadrzędny). Jest to niezbędne, gdy trzeba zapisać lub zarejestrować jednoznaczną lokalizację pliku.

# 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() i basename()

dirname() wyodrębnia część ścieżki oznaczającą katalog, a basename() wyodrębnia część oznaczającą nazwę pliku. Są to odpowiedniki powłokowych poleceń Unix dirname i 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() — sprawdzanie przed odczytem

Zawsze sprawdzaj, czy plik istnieje, zanim spróbujesz go odczytać, aby uniknąć niejasnych komunikatów o błędach. file.exists() zwraca TRUE lub FALSE i działa zarówno dla plików, jak i katalogów.

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() — ścieżki w zmiennych środowiskowych

Zmienne środowiskowe przechowują ścieżki na poziomie systemu, takie jak katalog domowy, folder tymczasowy i niestandardowe ścieżki aplikacji. Sys.getenv() odczytuje te wartości, dzięki czemu kod można dostosować do różnych systemów bez wpisywania ścieżek na stałe.

# 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() — rozwijanie tyldy

Tylda ~ jest skrótem oznaczającym katalog domowy w systemach uniksopodobnych, ale funkcje plikowe R nie zawsze rozwijają ją automatycznie. path.expand() zastępuje ~ rzeczywistą ścieżką katalogu domowego.

# 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')

Wyświetlanie plików za pomocą list.files()

list.files() (alias dir()) wyświetla pliki w katalogu, opcjonalnie filtrując je według wzorca i opcjonalnie zwracając pełne ścieżki. Jest niezastąpiona, gdy trzeba przetworzyć wiele plików w folderze.

# 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))

Tworzenie i usuwanie ścieżek

R ma wbudowane funkcje do tworzenia katalogów i zarządzania plikami. Używaj dir.create() do tworzenia nowych folderów (z recursive = TRUE, aby tworzyć zagnieżdżone ścieżki) oraz file.remove() do usuwania plików tymczasowych.

# 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')
}

Pakiet here — ścieżki względem projektu

Pakiet here elegancko rozwiązuje problem katalogu roboczego. here::here() zawsze buduje ścieżki względem katalogu głównego projektu (w którym znajduje się plik .Rproj), niezależnie od miejsca w projekcie, z którego funkcja jest wywoływana.

# 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)

Szybki test

Masz ciąg ścieżki 'data/raw/../clean/sales.csv'. Jakiej funkcji użyjesz, aby rozwiązać go do czystej, kanonicznej ścieżki bezwzględnej?

Ścieżki plików — najważniejsze informacje

Solidna obsługa ścieżek plików jest niezbędna do tworzenia powtarzalnych skryptów R:

  • getwd() / setwd() — pobieranie i ustawianie katalogu roboczego
  • file.path('a', 'b', 'c.csv') — konstruowanie ścieżek przenośnych między systemami operacyjnymi
  • normalizePath(path, mustWork = FALSE) — rozwiązywanie ścieżki do postaci bezwzględnej
  • dirname() / basename() — rozdzielanie ścieżki na folder i plik
  • file.exists() — sprawdzanie istnienia pliku przed odczytem
  • Sys.getenv('HOME') — uzyskiwanie dostępu do ścieżek systemowych za pomocą zmiennych środowiskowych
  • path.expand('~') — rozwijanie tyldy do katalogu domowego
  • list.files(pattern = '\.csv$') — wyszukiwanie plików według rozszerzenia
  • dir.create(recursive = TRUE) — bezpieczne tworzenie zagnieżdżonych katalogów
  • W projektach RStudio używaj pakietu here do obsługi ścieżek względnych względem projektu
# 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))
Bezpłatny start

Ucz się R dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
43
Lekcje
159

Często zadawane pytania

Czy lekcja „Katalogi robocze i ścieżki plików” jest bezpłatna?

Tak — pełny tekst „Katalogi robocze i ścieżki plików” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Katalogi robocze i ścieżki plików”?

Używaj getwd(), setwd() i here() do tworzenia niezawodnych ścieżek międzyplatformowych. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć R Academy?

Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Katalogi robocze i ścieżki plików”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?

Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Używanie source() do ładowania skryptów
  2. Komentarze, styl i czytelność
  3. Katalogi robocze i ścieżki plików
  4. Projekty R i zarządzanie obszarem roboczym
← Powrót do R Academy