文字列で表された名前でクラスター内のライブラリーを初期化したいとします。ライブラリ内の文字列名でライブラリを初期化する方法は?
このコードは正常に動作します:
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
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()))
}
}
その本体に
substitute
を使用する、
sfClusterEval
関数に渡されるべき表現のどのタイプundestandすることはできませんが、私はそれを解決し、誰かのアドバイスを必要としませんでした。
UPDATE:simplier例で
さらなる調査の詳細。真実が近くにあると感じます。 このコードは
sfClusterEval(library("e1071"))
正常に動作します。しかし、この呼び出しはエラーエン生成:4つのノードがエラーを生成します。最初のエラー:オブジェクトは 'libに' が見つかりません
lib <- "e1071"
sfClusterEval(library(lib, character.only=TRUE))
ANSWER:
変数lib
が以前にクラスタにエクスポートする必要があります。その後、それを取り除くことができます。
lib <- "e1071"
sfExport("lib")
sfClusterEval(library(lib, character.only=TRUE))
sfRemove("lib")
スタートアイデアを与えてくれてありがとう!
パッケージをワーカーに読み込むのに 'sfLibrary'を使わないのはなぜですか? –
Excelentアドバイス!私は降雪パッケージのこの機能が欠けていました。私には恥ずべき。 :)答えとしてこのコメントを投稿する場合は、解決策としてマークすることができます。 – DrDom