文字列として表される名前でクラスタ内のライブラリを初期化したいと考えています。
このコードは正常に動作します:
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 に感謝します。