.onLoad для создания новой среды в R - PullRequest
1 голос
/ 11 апреля 2019

В пакете, который я намереваюсь отправить в CRAN, я использую .onload (...) для создания новой среды, в которой будут храниться необходимые переменные без прямой модификации глобальной среды.

.onLoad <- function(...) {
  envr <- new.env() # when package is loaded, create new environment to store needed variables 
}

Эта функция сохраняется в файле с именем zzz.R.

Затем я использую assign (...) для назначения переменных новой среде:

assign("x", x, envir = envr)

Чтобы получить переменные в новой среде в моих созданных функциях, я делаю

envr$x

Однако при сборке, установке, загрузке моего пакета и запуске моей основной функции я получаю сообщение об ошибке, что объект 'envr' не может быть найден.

Мне интересно, что здесь происходит.

Создание новой среды непосредственно в R работает нормально:

envr <- new.env()
envr$a <- 5
envr$a
[1] 5

Есть какие-нибудь мысли по решению проблемы?

1 Ответ

1 голос
/ 11 апреля 2019

Ваш код

envr <- new.env()

назначает новую среду локальной переменной в функции .onLoad. Когда эта функция завершается, переменная больше нигде не видна.

Вы можете сделать свое назначение вне функции, используя <<-, но вы должны быть осторожны. Это заставляет R просматривать окружающие среды, пока не найдет переменную. Если он никогда не найдет его, он выполнит назначение в глобальной среде, и вы не сможете в него писать, поэтому CRAN не примет ваш пакет.

Таким образом, правильный способ сделать это - создать переменную вне любой функции, как предложено в https://stackoverflow.com/a/12605694/2372064,, или создать переменную вне функции, но создать среду при загрузке, например,

envr <- NULL
.onLoad <- function(...) {
  envr <<- new.env() # when package is loaded, create new environment to store needed variables 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...