我想通过名称表示为字符串的名称来初始化集群中的库。
此代码可以正常工作:
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")
感谢里奇,给出了开始的想法!
答案 0 :(得分:2)
您可以使用sfLibrary
在工作人员上加载额外的包。请参阅?snowfall
,然后点击snowfall-tools
。
答案 1 :(得分:1)
无论是否在群集中,您只需使用character.only
参数library
。
library("e1071", character.only = TRUE)
如果您的节点报告错误,指出他们找不到该软件包,请仔细检查该软件包是否安装在该计算机上,位于.libPaths()
之一的位置。如果所有其他方法都失败了,请将lib.loc
参数中包的位置明确提供给library
。