Загрузка скриптов с помощью source()
Выполняйте внешние скрипты R и делитесь кодом между файлами с помощью source().
«Загрузка скриптов с помощью source()» — бесплатный урок R Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.
Зачем использовать source()
По мере роста проектов на R хранить весь код в одном файле становится неудобно. Функция source() позволяет загружать и выполнять внешний файл скрипта на R, разделяя работу на логические повторно используемые модули.
Это основа организованной разработки на R.
# Imagine helpers.R contains:
# add <- function(a, b) a + b
# multiply <- function(a, b) a * b
# Load it into your main script:
source('helpers.R')
# Now use the functions defined there:
result <- add(3, 5)
cat('Result:', result)Базовый синтаксис source()
В простейшей форме source() принимает путь к файлу как единственный аргумент. Файл читается, а каждое выражение в нём вычисляется в текущем окружении — так же, как если бы Вы ввели этот код напрямую.
# source() with a relative path (file in working directory)
source('my_functions.R')
# source() with an absolute path
source('/Users/alice/projects/utils.R')
# After sourcing, all objects and functions defined
# in the file are available in your current session
cat('Script loaded successfully')Параметр echo
Параметр echo определяет, выводится ли каждое выражение из подключаемого файла в консоль по мере выполнения. По умолчанию используется echo = FALSE, поэтому консоль остаётся чистой. Значение TRUE удобно при отладке.
# Default: silent loading (echo = FALSE)
source('helpers.R')
# Verbose: print each expression as it runs
source('helpers.R', echo = TRUE)
# echo = TRUE output looks like:
# > add <- function(a, b) a + b
# > multiply <- function(a, b) a * b
cat('Done')print.eval и verbose
Ещё два параметра позволяют точнее управлять выводом. print.eval определяет, выводятся ли результаты выражений (аналогично интерактивному режиму). verbose выводит дополнительные сведения о самом процессе подключения файла.
# print.eval: print the VALUE of each expression
source('helpers.R', echo = TRUE, print.eval = TRUE)
# verbose: extra details like file name and line numbers
source('helpers.R', verbose = TRUE)
# Typical use: debugging a complex script
# source('complex_analysis.R', echo = TRUE, print.eval = TRUE)
cat('Parameters explored')Параметр local — изолированная область видимости
По умолчанию source() выполняет код в глобальном окружении, поэтому все созданные объекты появляются в рабочем пространстве. Значение local = TRUE запускает скрипт в новом изолированном окружении, сохраняя глобальное рабочее пространство чистым.
# Without local: objects pollute global env
source('data_prep.R') # x, y, temp_df all appear in ls()
# With local = TRUE: objects stay inside
source('data_prep.R', local = TRUE)
# x, y, temp_df are NOT in your global workspace
# Verify nothing leaked:
cat('Objects in workspace:', length(ls()))
# local can also be an environment object:
my_env <- new.env()
source('data_prep.R', local = my_env)sys.source() для более безопасной загрузки
sys.source() — низкоуровневая альтернатива, избегающая части накладных расходов source(). Она не изменяет рабочий каталог и не вычисляет параметры keepSource. Её часто используют при разработке пакетов и создании внутренних инструментов.
# sys.source() loads a file into a specific environment
utils_env <- new.env()
sys.source('utils.R', envir = utils_env)
# Access functions from that environment explicitly
result <- utils_env$my_helper(10)
cat('Result:', result)
# sys.source does not echo or verbose options
# It is faster and more predictable for package internals
cat('sys.source demo complete')Относительные и абсолютные пути
Использование относительных путей в source() делает проект переносимым — путь к файлу определяется относительно текущего рабочего каталога. Абсолютные пути работают везде, но перестают работать после перемещения проекта. В рабочих процессах на основе проектов отдавайте предпочтение относительным путям.
# Relative path — resolved from getwd()
source('R/helpers.R') # good for projects
source('scripts/utils.R') # subfolder
source('../shared/common.R') # parent folder
# Absolute path — fragile, machine-specific
source('/Users/alice/project/R/helpers.R')
# Check current working directory first:
cat('Working dir:', getwd())
# Best practice: use file.path() for clarity
source(file.path('R', 'helpers.R'))Подключение нескольких файлов
Вы можете несколько раз вызвать source(), чтобы загрузить несколько вспомогательных файлов. Распространённый подход — использовать единый файл-точку входа в стиле setup.R или _targets.R, который подключает все нужные модули в правильном порядке.
# main.R — entry point that loads all modules
source('R/data_loading.R')
source('R/cleaning.R')
source('R/analysis.R')
source('R/plotting.R')
# Or source all .R files in a directory:
r_files <- list.files('R', pattern = '\\.R$', full.names = TRUE)
for (f in r_files) {
source(f)
cat('Loaded:', f, '\n')
}
cat('All modules loaded')source() с chdir
Параметр chdir на время выполнения изменяет рабочий каталог на каталог, содержащий подключаемый файл. Это удобно, когда вспомогательный скрипт использует собственные относительные пути.
# Suppose scripts/analysis.R uses source('helpers.R')
# and helpers.R is also in scripts/
# Without chdir: R looks for helpers.R in YOUR working dir
source('scripts/analysis.R') # may fail
# With chdir = TRUE: working dir shifts to scripts/ temporarily
source('scripts/analysis.R', chdir = TRUE) # helpers.R found!
# After source() returns, working dir goes back to original
cat('Working dir restored:', getwd())Автоматическое подключение при запуске через .Rprofile
Файл .Rprofile в домашнем каталоге (или корне проекта) автоматически выполняется при каждом запуске R. Вы можете использовать в нём source(), чтобы автоматически загружать вспомогательные средства, задавать параметры или подключать пакеты при каждом запуске сеанса.
# .Rprofile (in ~ or project root):
# source('~/.R/my_utils.R') # load personal helpers
# options(scipen = 999) # no scientific notation
# To open and edit .Rprofile:
file.edit('~/.Rprofile')
# To see where .Rprofile files are looked for:
cat(Sys.getenv('R_PROFILE_USER'))
# Caution: heavy .Rprofile slows R startup
# Keep it minimal — load only what you always need
cat('.Rprofile concept shown')source() на практике — структура проекта
Удобная структура реального проекта — папка R/ для всех вспомогательных скриптов и один файл run.R или main.R, который их подключает. Так проект легко воспроизводить и совместно использовать.
# Project structure:
# my_project/
# run.R <- entry point
# R/
# 01_load.R <- data loading
# 02_clean.R <- data cleaning
# 03_model.R <- modeling
# 04_report.R <- output
# run.R content:
cat('=== Starting analysis ===\n')
source('R/01_load.R')
source('R/02_clean.R')
source('R/03_model.R')
source('R/04_report.R')
cat('=== Analysis complete ===\n')Быстрая проверка
Какой параметр source() предотвращает появление объектов, созданных в подключаемом файле, в глобальном окружении?
source() — главное
source() — встроенный в R способ модульной организации кода:
source('file.R')— загрузить и выполнить скрипт в глобальном окруженииecho = TRUE— выводить каждое выражение (особенно удобно при отладке)local = TRUE— выполнять в изоляции, без побочных эффектов в глобальном окруженииchdir = TRUE— временно сменить рабочий каталог на каталог файлаsys.source()— низкоуровневая альтернатива, используемая в пакетах- Для переносимости отдавайте предпочтение относительным путям и рабочим процессам на основе проектов
- Используйте
.Rprofile, чтобы автоматически подключать вспомогательные скрипты при запуске R
# Quick reference
source('R/helpers.R') # basic load
source('R/helpers.R', echo = TRUE) # verbose
source('R/helpers.R', local = TRUE) # isolated
source('scripts/run.R', chdir = TRUE) # local paths
env <- new.env()
sys.source('R/helpers.R', envir = env) # low-level
cat('source() mastered!')Часто задаваемые вопросы
Урок «Загрузка скриптов с помощью source()» бесплатный?
Да — полный текст урока «Загрузка скриптов с помощью source()» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.
Чему я научусь в уроке «Загрузка скриптов с помощью source()»?
Выполняйте внешние скрипты R и делитесь кодом между файлами с помощью source(). Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать R Academy?
Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Загрузка скриптов с помощью source()»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке R Academy?
Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Загрузка скриптов с помощью source()
- Комментарии, стиль и читаемость
- Рабочие каталоги и пути к файлам
- Проекты R и управление рабочей областью