R Academy · Урок

Рабочие каталоги и пути к файлам

Используйте getwd(), setwd() и here() для надёжной работы с путями на разных платформах.

Урок 3 из 413 шагов

«Рабочие каталоги и пути к файлам» — бесплатный урок 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.R

setwd() — изменение рабочего каталога

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 automatically

file.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 — локальная установка не требуется.

Все уроки этого курса

  1. Загрузка скриптов с помощью source()
  2. Комментарии, стиль и читаемость
  3. Рабочие каталоги и пути к файлам
  4. Проекты R и управление рабочей областью
← Назад к R Academy