2

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

此代码工作正常:

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,为您提供了最初的想法!

4

2 回答 2

2

您可以使用sfLibrary在工作人员身上加载额外的包。查看?snowfall并单击snowfall-tools

于 2012-02-05T20:28:16.563 回答
1

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

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

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

于 2012-02-03T10:49:53.807 回答