R Academy · Урок

Создание и проверка окружений

Используйте new.env(), environment(), ls() и get() для работы с окружениями.

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

«Создание и проверка окружений» — бесплатный урок R Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Создание нового окружения

new.env(parent = e) создаёт новое пустое окружение. Аргумент parent задаёт окружение, в котором будет выполняться поиск, если имя не найдено в новом окружении. Используйте emptyenv() для полностью изолированного окружения.

# Isolated environment (no parent chain)
e1 <- new.env(parent = emptyenv())
# Environment with global as parent
e2 <- new.env(parent = globalenv())
cat('e1 parent:', environmentName(parent.env(e1)), '\n')
cat('e2 parent:', environmentName(parent.env(e2)), '\n')

assign() — добавление привязок

assign('name', value, envir = e) создаёт или обновляет именованную привязку в указанном окружении. Это программный эквивалент e$name <- value, но он работает, когда имя хранится в переменной.

e <- new.env(parent = emptyenv())
assign('x', 10, envir = e)
assign('y', 'hello', envir = e)
assign('z', TRUE, envir = e)
cat('x:', get('x', envir = e), '\n')
cat('y:', get('y', envir = e), '\n')

get() и mget()

get('name', envir = e) извлекает одну привязку. mget(c('a','b'), envir = e) одновременно извлекает несколько привязок и возвращает именованный список. Обе функции выдают ошибку, если имя не существует (если только inherits не разрешает поиск по цепочке).

e <- new.env(parent = emptyenv())
e$alpha <- 1
e$beta  <- 2
e$gamma <- 3
# Single
get('alpha', envir = e)
# Multiple
mget(c('alpha', 'beta', 'gamma'), envir = e)

ls() — список привязок

ls(envir = e) возвращает вектор типа character со всеми именами, привязанными в окружении e. Добавьте all.names = TRUE, чтобы включить имена, начинающиеся с . (по умолчанию они скрыты). Имена возвращаются в алфавитном порядке.

e <- new.env(parent = emptyenv())
e$b_val  <- 2
e$a_val  <- 1
e$.secret <- 'hidden'
cat('Default ls:', ls(envir = e), '\n')
cat('All names :', ls(envir = e, all.names = TRUE), '\n')

exists() с inherits

exists('name', envir = e, inherits = FALSE) проверяет только указанное окружение, не просматривая его родительские окружения. При inherits = TRUE (значение по умолчанию) также выполняется поиск по цепочке родителей. Используйте inherits = FALSE для строгой проверки локальной области.

parent_e <- new.env(parent = emptyenv())
parent_e$shared <- 42
child_e  <- new.env(parent = parent_e)
# inherits=TRUE: finds shared in parent
cat('inherits TRUE:', exists('shared', envir = child_e, inherits = TRUE),  '\n')
# inherits=FALSE: only looks in child
cat('inherits FALSE:', exists('shared', envir = child_e, inherits = FALSE), '\n')

environmentName() и parent.env()

environmentName(e) возвращает имя встроенного окружения ('R_GlobalEnv', 'package:base' и т. д.). Для созданных пользователем окружений возвращается ''. parent.env(e) возвращает объект родительского окружения.

e <- new.env(parent = globalenv())
cat('Name of e     :', environmentName(e), '\n')
cat('Parent of e   :', environmentName(parent.env(e)), '\n')
cat('Name of global:', environmentName(globalenv()), '\n')

Синтаксис $ для окружений

Окружения поддерживают синтаксис $ и [[, как и списки, для чтения и записи привязок. Для прямого доступа, когда имя известно во время записи, это часто удобнее, чем get()/assign().

e <- new.env(parent = emptyenv())
e$pi_approx <- 3.14159
e[['e_approx']] <- 2.71828
cat('pi:', e$pi_approx, '\n')
cat('e :', e[['e_approx']], '\n')

rm() в определённом окружении

rm('name', envir = e) удаляет привязку из определённого окружения. Это отличается от удаления глобальной переменной: при работе с пользовательскими окружениями нужно явно указать окружение.

e <- new.env(parent = emptyenv())
e$keep <- 1
e$remove_me <- 99
cat('Before:', ls(envir = e), '\n')
rm('remove_me', envir = e)
cat('After :', ls(envir = e), '\n')

as.list() для выгрузки окружения

as.list(e) преобразует все привязки окружения в именованный список, что упрощает проверку или сериализацию содержимого. Результат является снимком: последующие изменения окружения не отражаются в списке.

e <- new.env(parent = emptyenv())
e$x <- 10
e$y <- 20
e$z <- 30
bindings <- as.list(e)
cat('Class:', class(bindings), '\n')
cat('Length:', length(bindings), '\n')
str(bindings)

Окружения как хеш-таблицы

Параметр hash = TRUE в new.env() (по умолчанию, если задан родитель) включает поиск на основе хеширования, благодаря чему поиск имени выполняется за O(1). Поэтому большие окружения значительно быстрее списков при хранении пар «ключ — значение».

# Build a small key-value store
store <- new.env(hash = TRUE, parent = emptyenv())
keys   <- paste0('key_', 1:5)
values <- c(10, 20, 30, 40, 50)
for (i in seq_along(keys)) assign(keys[i], values[i], envir = store)
# Retrieve
cat('key_3 =', get('key_3', envir = store), '\n')
cat('All keys:', ls(store), '\n')

Копирование и совместное использование окружений

Присваивание окружения новой переменной не создаёт его копию — обе переменные ссылаются на один и тот же объект. Если нужны независимые окружения, используйте as.list(), а затем list2env(), чтобы создать настоящую копию.

e1 <- new.env(parent = emptyenv())
e1$val <- 100
e2 <- e1          # reference, not a copy
e2$val <- 999
cat('e1$val:', e1$val, '\n')  # 999, modified via e2!

# True copy:
e3 <- list2env(as.list(e1), parent = emptyenv())
e3$val <- 0
cat('e1$val after e3 change:', e1$val, '\n')  # still 999

Быстрая проверка

Какая функция проверяет, связано ли имя с объектом в окружении, не выполняя поиск в родительских окружениях?

Создание окружений: главное

Главное о создании и просмотре окружений:

  • new.env(parent=e) создаёт новое пустое окружение; hash=TRUE — для больших хранилищ
  • assign('x', v, envir=e) и get('x', envir=e) обеспечивают программный доступ
  • e$x и e[['x']] работают подобно средствам доступа к спискам
  • ls(envir=e) выводит имена; exists('x', envir=e, inherits=FALSE) выполняет строгую проверку
  • as.list(e) преобразует окружение в список; list2env() восстанавливает его
  • Окружения являются ссылочными объектами — присваивание создаёт общую ссылку, а не копию
config <- new.env(hash = TRUE, parent = emptyenv())
assign('host', 'localhost', envir = config)
assign('port', 5432L,       envir = config)
assign('db',   'mydb',      envir = config)
cat('Keys  :', ls(config), '\n')
cat('host  :', config$host, '\n')
cat('port  :', config$port, '\n')
Можно начать бесплатно

Изучай R с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
43
Уроки
159

Часто задаваемые вопросы

Урок «Создание и проверка окружений» бесплатный?

Да — полный текст урока «Создание и проверка окружений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Создание и проверка окружений»?

Используйте new.env(), environment(), ls() и get() для работы с окружениями. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Создание и проверка окружений»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Что такое окружение в R?
  2. Правила лексической области видимости
  3. Глобальная и локальная область видимости
  4. Создание и проверка окружений
← Назад к R Academy