私はdoSMPパッケージを使って 'foreach'ループで自分のコードをスピードアップしようとしています。ここでparallizedループ(doSMP)でsource()関数を使用する方法は?
は私の問題の簡易版である:main.R::
require(doSMP)
dropbox_path = "/home/ruser/Dropbox"
workers <- startWorkers(4)
registerDoSMP(workers)
foreach(jj=1:4) %dopar% source("test.R")
stopWorkers(workers)
ファイル:test.R:
message(dropbox_path)
私はmain.R
というファイル
ファイルを実行しています
これは次のエラーを返します。 "ソース(" test.R ")のエラー: タスク1が失敗しました - "オブジェクト 'dropbox_path'が見つかりません "
私はあることをmain.Rを変更する場合:それはその後、非常にうまく機能
require(doSMP)
dropbox_path = "/home/ruser/Dropbox"
workers <- startWorkers(4)
registerDoSMP(workers)
foreach(jj=1:4) %dopar% message(dropbox_path)
stopWorkers(workers)
。 これはまた、シーケンシャルコード( 'foreach'の代わりに 'for')とうまく機能するために使用されました。
したがって、R子インスタンスはdropbox_path変数にアクセスできますが、ソース関数によって解析された場合はアクセスできません。私はsource()関数の引数 'local'と 'chdir'を使って成功しなかった。
コードが機能する方法をご存知でしょうか?私はsource()関数を使い続けたいと思います。
Iローマ、Iあなたのコードをテストし、同じ問題が発生しました:あなたのtiny_script .Rは変数を使用しません。 date()の代わりに、mine:message(dropbox_path)などの変数を必要とする関数がある場合、dropbox_pathがグローバル環境にある場合、同じエラーが発生します。 私の質問は、ソース内のスクリプトが親環境の変数をどのように使用できるか(2番目の例で示したように、子環境がアクセスできること)ですか? – Sam
@Samすべての変数をコアにエクスポートする必要があります。 'sfExport(list = c(" var1 "、" var2 "、" function1 "))'です。 –
ok()関数は動作しませんが、ソース(script.R)には変数へのアクセス権があります。私はdoSMPの代わりに降雪パッケージを使用できるかどうかを確認します – Sam