如何在集群中按字符串名称初始化库?

时间:2012-02-03 08:24:10

标签: r substitution snowfall

我想通过名称表示为字符串的名称来初始化集群中的库。

此代码可以正常工作:

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")

感谢里奇,给出了开始的想法!

2 个答案:

答案 0 :(得分:2)

您可以使用sfLibrary在工作人员上加载额外的包。请参阅?snowfall,然后点击snowfall-tools

答案 1 :(得分:1)

无论是否在群集中,您只需使用character.only参数library

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

如果您的节点报告错误,指出他们找不到该软件包,请仔细检查该软件包是否安装在该计算机上,位于.libPaths()之一的位置。如果所有其他方法都失败了,请将lib.loc参数中包的位置明确提供给library