Проблемы среды R при создании пакета - PullRequest
2 голосов
/ 06 апреля 2020

Допустим, у меня есть функция, которая инициализирует новую среду:

init <-function()
{
    e <- new.env()
}

Кроме того, функция init живет в другом файле .R

Затем, после ее инициализации, Я хочу начать использовать его в других вызовах функций в других файлах, таких как

init.main <- function(e)
{
    e$data <- list()
    e$number <- 0
}

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

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Это действительно зависит от того, хотите ли вы только один e или хотите иметь возможность иметь несколько сред с разным содержимым.

В первом случае просто определите e на верхнем уровне в ваш пакет, и ваша функция init изменяет эту копию. Например,

e <- new.env()
init <- function() {
  e <<- new.env()
}

Тогда любая другая функция в вашем пакете может увидеть e и использовать ее. Вызов init() уничтожит любое предыдущее содержимое и установит его пустым.

Другой случай немного сложнее, просто потому, что вам нужно обрабатывать несколько функций с одинаковыми именами, которые относятся к разным e ценности. Пример этого есть в разделе 10.7 руководства «Введение в R», поставляемого с R.

1 голос
/ 06 апреля 2020

Вот один из методов.

init <- local({
  e <- NULL
  function() {
    e <<- new.env(parent = emptyenv())
  }
})
init.main <- function() {
  e <- get("e", envir = environment(init))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...