Katalogi robocze i ścieżki plików
Używaj getwd(), setwd() i here() do tworzenia niezawodnych ścieżek międzyplatformowych.
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.Rsetwd() — 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 automaticallyfile.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 roboczegofile.path('a', 'b', 'c.csv')— konstruowanie ścieżek przenośnych między systemami operacyjnyminormalizePath(path, mustWork = FALSE)— rozwiązywanie ścieżki do postaci bezwzględnejdirname()/basename()— rozdzielanie ścieżki na folder i plikfile.exists()— sprawdzanie istnienia pliku przed odczytemSys.getenv('HOME')— uzyskiwanie dostępu do ścieżek systemowych za pomocą zmiennych środowiskowychpath.expand('~')— rozwijanie tyldy do katalogu domowegolist.files(pattern = '\.csv$')— wyszukiwanie plików według rozszerzeniadir.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))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
- Używanie source() do ładowania skryptów
- Komentarze, styl i czytelność
- Katalogi robocze i ścieżki plików
- Projekty R i zarządzanie obszarem roboczym