我想通过以字符串表示的名称来初始化集群中的库。
此代码工作正常:
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"))
但是这个调用产生了错误:4 个节点产生了错误;第一个错误:找不到对象“lib”
lib <- "e1071"
sfClusterEval(library(lib, character.only=TRUE))
回答:
该变量lib
应事先导出到集群。之后,它可以被删除。
lib <- "e1071"
sfExport("lib")
sfClusterEval(library(lib, character.only=TRUE))
sfRemove("lib")
感谢 Richie,为您提供了最初的想法!