Рабочие каталоги и пути к файлам
Используйте getwd(), setwd() и here() для надёжной работы с путями на разных платформах.
«Рабочие каталоги и пути к файлам» — бесплатный урок R Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.
Что такое рабочий каталог
Рабочий каталог — это папка, которую R использует как отправную точку при обращении к файлам по относительным путям. Если полный путь не указан, это место, где R по умолчанию ищет файлы и сохраняет их. В каждый момент времени у сеанса R есть ровно один рабочий каталог.
# 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() — изменение рабочего каталога
setwd() изменяет рабочий каталог для текущего сеанса R. Функция невидимо возвращает предыдущий рабочий каталог, что удобно для восстановления состояния. Примечание: использование setwd() в скриптах не рекомендуется в рабочих процессах на основе проектов.
# 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() — создание переносимых путей
file.path() создаёт пути к файлам, соединяя компоненты правильным разделителем для операционной системы (/ в Mac/Linux, \ в Windows). Для совместимости между платформами всегда используйте её вместо объединения строк.
# 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() — преобразование в абсолютный путь
normalizePath() преобразует относительный путь в каноническую абсолютную форму, обрабатывая компоненты . (текущий каталог) и .. (родительский каталог). Это необходимо, когда нужно сохранить или записать в журнал однозначное расположение файла.
# 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() и basename()
dirname() извлекает из пути часть с каталогом, а basename() — часть с именем файла. Это аналоги команд оболочки Unix dirname и basename в R.
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() — проверка перед чтением
Всегда проверяйте существование файла перед попыткой его прочитать, чтобы избежать малопонятных сообщений об ошибках. file.exists() возвращает TRUE или FALSE и работает как с файлами, так и с каталогами.
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() — пути в переменных окружения
Переменные окружения хранят системные пути, например путь к домашнему каталогу, временной папке и пользовательским каталогам приложений. Sys.getenv() считывает эти значения, благодаря чему код адаптируется к разным системам без жёстко заданных путей.
# 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() — раскрытие тильды
Тильда ~ является сокращением для домашнего каталога в Unix-подобных системах, но файловые функции R не всегда раскрывают её автоматически. path.expand() заменяет ~ фактическим путём к домашнему каталогу.
# 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')Перечисление файлов с помощью list.files()
list.files() (псевдоним dir()) выводит список файлов в каталоге, при необходимости фильтруя их по шаблону и возвращая полные пути. Эта функция незаменима, когда нужно обработать несколько файлов в папке.
# 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))Создание и удаление путей
В R есть встроенные функции для создания каталогов и управления файлами. Используйте dir.create() для создания новых папок (с recursive = TRUE для создания вложенных путей), а file.remove() — для удаления временных файлов.
# 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')
}Пакет here — пути относительно проекта
Пакет here элегантно решает проблему рабочего каталога. here::here() всегда строит пути относительно корня проекта (где находится файл .Rproj), независимо от того, из какой части проекта Вы его вызываете.
# 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)Быстрая проверка
У вас есть строка пути 'data/raw/../clean/sales.csv'. Какую функцию следует использовать, чтобы преобразовать её в корректный канонический абсолютный путь?
Пути к файлам — основные выводы
Надёжная работа с путями к файлам необходима для воспроизводимых скриптов R:
getwd()/setwd()— получить и установить рабочий каталогfile.path('a', 'b', 'c.csv')— построить путь, переносимый между операционными системамиnormalizePath(path, mustWork = FALSE)— преобразовать путь в абсолютныйdirname()/basename()— разделить путь на каталог и файлfile.exists()— проверить существование перед чтениемSys.getenv('HOME')— получить доступ к системным путям через переменные окруженияpath.expand('~')— развернуть тильду в путь к домашнему каталогуlist.files(pattern = '\.csv$')— найти файлы по расширениюdir.create(recursive = TRUE)— безопасно создать вложенные каталоги- Используйте пакет here для путей относительно проекта в проектах 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))Изучай R с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 43
- Уроки
- 159
Часто задаваемые вопросы
Урок «Рабочие каталоги и пути к файлам» бесплатный?
Да — полный текст урока «Рабочие каталоги и пути к файлам» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.
Чему я научусь в уроке «Рабочие каталоги и пути к файлам»?
Используйте getwd(), setwd() и here() для надёжной работы с путями на разных платформах. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать R Academy?
Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Рабочие каталоги и пути к файлам»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке R Academy?
Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Загрузка скриптов с помощью source()
- Комментарии, стиль и читаемость
- Рабочие каталоги и пути к файлам
- Проекты R и управление рабочей областью