Как инициализировать библиотеки по их строковым именам в кластере? - PullRequest
2 голосов
/ 03 февраля 2012

Я хочу инициализировать библиотеки в кластере по их именам, представленным в виде строк.

Этот код отлично работает:

library(snowfall, rlecuyer, rsprng)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
sfClusterEval(library(e1071))

И этот код выдает ошибку en: 4 nodes produced errors; first error: object 'expr' not found

library(snowfall, rlecuyer, rsprng)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
lib <- "e1071"
expr <- parse(text=paste("library(", lib, ")", sep=""))
sfClusterEval(expr)

Поэтому sfClusterEval попытайтесь вычислить expr, а не выражение, которое содержит expr. Я не могу понять, какой тип выражения должен быть передан функции sfClusterEval, которая использует substitute в своем теле

> sfClusterEval
function (expr, stopOnError = TRUE) 
{
    sfCheck()
    if (sfParallel()) {
        return(sfClusterCall(eval, substitute(expr), env = globalenv(), 
            stopOnError = stopOnError))
    }
    else {
        return(eval(expr, envir = globalenv(), enclos = parent.frame()))
    }
}

Этот вопрос кажется простым, но я не смог решить его, и мне нужен чей-то совет.

UPDATE:

Дальнейшие подробности расследования на более простых примерах. Я чувствую, что правда близка. Этот код отлично работает

sfClusterEval(library("e1071"))

Но этот вызов вызывает ошибку: 4 узла выдавали ошибки; первая ошибка: объект 'lib' не найден

lib <- "e1071"
sfClusterEval(library(lib, character.only=TRUE))

ОТВЕТ:

Переменная lib должна быть экспортирована в кластер ранее. И после этого его можно удалить.

lib <- "e1071"
sfExport("lib")
sfClusterEval(library(lib, character.only=TRUE))
sfRemove("lib")

Спасибо за Ричи, за то, что дали стартовую идею!

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Вы можете использовать sfLibrary для загрузки дополнительных пакетов на рабочих. См. ?snowfall и нажмите snowfall-tools.

1 голос
/ 03 февраля 2012

В кластере или нет, вы просто используете аргумент character.only для library.

library("e1071", character.only = TRUE)

Если ваши узлы сообщают об ошибке, сообщающей, что они не могут найти пакет, дважды проверьте, что пакет установлен на этом компьютере, в расположении, которое является одним из .libPaths().Если ничего не помогает, явно укажите местоположение пакета в аргументе lib.loc для library.

...