0Pricing
R Academy · Урок

Загрузка скриптов с помощью 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 — локальная установка не требуется.

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

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