Я хочу инициализировать библиотеки в кластере их именами, представленными в виде строк.
Этот код работает нормально:
library(snowfall, rlecuyer, rsprng)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
sfClusterEval(library(e1071))
И этот код выдает ошибку: 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()))
}
}
Этот вопрос кажется простым, но я не смог его решить и нуждаюсь в чьем-то совете.
ОБНОВЛЕНИЕ:
Подробности дальнейшего исследования на более простых примерах. Я чувствую, что истина рядом. Этот код работает нормально
sfClusterEval(library("e1071"))
Но этот вызов выдает en error: 4 узла выдали ошибки; первая ошибка: объект 'lib' не найден
lib <- "e1071"
sfClusterEval(library(lib, character.only=TRUE))
ОТВЕТ:
Переменная lib
должна быть предварительно экспортирована в кластер. И после этого его можно удалить.
lib <- "e1071"
sfExport("lib")
sfClusterEval(library(lib, character.only=TRUE))
sfRemove("lib")
Спасибо за Ричи, за то, что дал стартовую идею!
sfLibrary
для загрузки пакетов в воркеры? - person Roman Luštrik   schedule 03.02.2012