Я хочу инициализировать библиотеки в кластере по их именам, представленным в виде строк.
Этот код отлично работает:
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")
Спасибо за Ричи, за то, что дали стартовую идею!