Создание и сериализация / сохранение глобальной переменной из NAMESPACE в R - PullRequest
1 голос
/ 29 октября 2010

Я хотел бы создать функцию в пакете с NAMESPACE, которая будет save некоторыми переменными.Проблема заключается в том, что при вызове load в файле .Rdata он пытается загрузить пространство имен пакета, в котором содержится функция, создавшая файл .Rdata, но этот пакет загружать не нужно.

Этопример функции находится в пакете в пространстве имен:

create.global.function <- function(x, FUN, ...) {
 environment(FUN) <- .GlobalEnv
 assign(".GLOBAL.FUN", function(x) { FUN(x, ...) }, env=.GlobalEnv)
 environment(.GLOBAL.FUN) <- .GlobalEnv
 save(list = ls(envir = .GlobalEnv, all.names = TRUE),
      file = "/tmp/.Rdata",
      envir = .GlobalEnv)
}

Недостаточно вызовов environment(.GLOBAL.FUN) <- .GlobalEnv, и присоединение gdb к процессу R подтверждает, что он сериализует NAMESPACESXP здесь с именем пространства имен пакетаи load завершается ошибкой, потому что он не может загрузить это.

Возможно ли полностью удалить пространство имен из .GLOBAL.FUN до I save, чтобы оно могло быть загружено в другие экземпляры Rне пытаясь загрузить пространство имен?

1 Ответ

0 голосов
/ 31 октября 2010

@ JorisMeys snowfall и другие не предлагают именно эту функциональность.

снегопад использует sfExport (из clusterFunctions.R в снегопаде) для экспорта локальных и глобальных объектов в подчиненные узлы, а это, в свою очередь, использует sfClusterCall, который является оболочкой для функции clusterCall из снега.

res <- sfClusterCall( assign, name, val, env = globalenv(),
                      stopOnError = FALSE )

И библиотека снега загружается на клиентов, которые справляются с любыми проблемами пространства имен, как я уже упоминал в последнем предложении моего вопроса. Я бы не хотел загружать пространство имен там.

Более того, кажется, что сделаны упрощенные предположения, такие как то, что узлы будут иметь общую точку монтирования NFS для общих данных (например, функция sfSource в clusterFunctions.R).

Меня больше интересует что-то вроде случая, когда узел сохраняет файл .Rdata, затем отправляет его в другой узел, которому не нужно загружать пространство имен пакета.

Кажется, сейчас я могу решить исходную проблему, используя eval.parent и подставив:

 assign(".GLOBAL.FUN",
         eval.parent(substitute(function(y) { FUN(y, ...) })),
         env=.GlobalEnv)

Я прошу прощения за публикацию snafu, но у меня нет ссылки на редактирование, хотя я разместил этот вопрос, и нет места для меня, чтобы оставить «комментарий» так же, как у меня есть это большое текстовое поле для ответ. Я пометил это для модерации, чтобы я мог получить некоторую помощь в этом и сослался на FAQ, в котором говорится о кнопках, которые не отображаются для меня, чтобы оставлять комментарии. Возникла проблема с этой новой учетной записью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...