2012-02-03 9 views
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) 

のでsfClusterEvalexprなく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") 

スタートアイデアを与えてくれてありがとう!

+1

パッケージをワーカーに読み込むのに 'sfLibrary'を使わないのはなぜですか? –

+0

Excelentアドバイス!私は降雪パッケージのこの機能が欠けていました。私には恥ずべき。 :)答えとしてこのコメントを投稿する場合は、解決策としてマークすることができます。 – DrDom

答えて

2

sfLibraryを使用して、追加のパッケージを労働者に積むことができます。 ?snowfallを参照し、snowfall-toolsをクリックしてください。

1

クラスタ内であろうとなかろうと、character.onlyという引数をlibraryに使用するだけです。

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

あなたのノードが、彼らは、パッケージ、パッケージは.libPaths()の一つである場所では、そのマシンにインストールされていることをダブルチェックを見つけることができないというエラーを報告した場合。他のすべてが失敗した場合は、へのパッケージの場所をlib.locに明示的に指定してください。

+0

ええと...このようなアプローチはこのような状況ではうまくいかないようです。答えの更新を参照してください。どこが間違っていますか? – DrDom

+0

@DrDom:パッケージの検索方法が更新されました。 –

+0

それはさらに簡単でした。変数 'lib'はクラスタノードにはなく、したがって、それらは目に見えませんでした。そして、私は、機能の評価が各ノードで別々に実行されることを理解しています。はい、論理的です、私は知っています。しかし、それにもかかわらず、私に正しい方向性を与えてくれて、多くのおかげです! – DrDom

関連する問題