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評価してみてください。本体で使用する関数にどのタイプの式を渡す必要があるのか​​ わかりませんexprexprsfClusterEvalsubstitute

> 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引数 to を使用するだけlibraryです。

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

ノードからパッケージが見つからないというエラーが報告された場合は、そのマシンの のいずれかの場所にパッケージがインストールされていることを再確認してください.libPaths()。他のすべてが失敗した場合は、 へのlib.loc引数でパッケージの場所を明示的に指定しlibraryます。

于 2012-02-03T10:49:53.807 に答える