2017-02-09 5 views
3

背景/動機: 私は開始から終了まで直線的に実行すると数日かかることがあるバイオインフォマティクスパイプラインを実行しています。幸いなことに、タスクのいくつかは、お互いに依存しないので、それらは個別に行うことができます。例えば、タスク2、3、および4のすべてのタスク1の出力に依存するが、お互いからの情報を必要としません。タスク5は、2,3,4の出力を入力として使用します。Rの新しいインスタンスを開き、そのインスタンス内でスクリプトを入手する

私は3つのタスクのそれぞれについて、Rの新しいインスタンスを開いて、それらを同時に実行するスクリプトを記述しようとしています。 3つすべてが完了したら、残りのパイプラインを続けることができます。私はより直線的なワークフローのために、過去に何をやったか

は、順番にソース(ソース())各タスクの添字1「マスター」のスクリプトを持っています。

私はSO精練し、Googleと、この特定の問題の解決策を見つけることができませんでしたしました。うまくいけば皆さんが助けることができます。

R内から、system()を実行して端末内でコマンドを呼び出し、openを実行してファイルを開くことができます。たとえば、次のように新しいターミナルインスタンスを開きます:

system("open -a Terminal .",wait=FALSE) 

同様に、私は私が私の人生があるために把握することはできませんどのような

system("open -a r .") 

を使用して、新しいRセッションを開始することができますそれは私のスクリプトのいずれかをソースするように、「入力」引数を設定する方法について説明します。たとえば、次の例では、新しい端末インスタンスを開き、新しいインスタンス内でrを呼び出してからスクリプトをソースすることを期待しています。

system("open -a Terminal .",wait=FALSE,input=paste0("r; source(\"/path/to/script/M_01-A.R\",verbose=TRUE,max.deparse.length=Inf)")) 

答えて

0

他の誰かが道路に興味を持っている場合に私自身の質問に答える。

このワークフローを実行する最善の方法は、自分自身をRだけで作業することに限定することではないと思います。bashスクリプトの作成には柔軟性があり、おそらくより直接的な解決策です。次の例は私に別のウェブサイトで提案されました。

#!/bin/bash 

# Run task 1 
Rscript Task1.R 

# now run the three jobs that use Task1's output 
# we can fork these using '&' to run in the background in parallel 
Rscript Task2.R & 
Rscript Task3.R & 
Rscript Task4.R & 

# wait until background processes have finished 
wait %1 %2 %3 

Rscript Task5.R 
1

あなたはfuture package(私は著者です)に興味があるかもしれません。これらv %<-% exprの各ステートメントは、R発現exprに基づいて将来を作成します(そして、それがすべての依存関係だ)と約束vに割り当て

library("future") 

v1 %<-% task1(args_1) 

v2 %<-% task2(v1, args_2) 
v3 %<-% task3(v1, args_3) 
v4 %<-% task4(v1, args_4) 

v5 %<-% task5(v2, v3, v4, args_5) 

:それはのように、あなたのコードを記述することができます。 vが使用されている場合のみ、ブロックされ、値vが利用可能になるまで待機します。

これらの未来がどのように解決されるかは、上記のコードのユーザーによって決定されます。たとえば、指定することにより:

library("future") 
plan(multiprocess) 

を先頭に、その後、先物(=異なるタスク)は、ローカルマシン上で並列的に解決されます。あなたが使用している場合は、

plan(cluster, workers = c("n1", "n3", "n3", "n5")) 

彼らはマシンのもので解決している(n3は、2つの同時ジョブを受け入れる場合)。

これは、すべてのオペレーティングシステム(Windowsを含む)で機能します。

Slurm、SGE、TORQUE/PBSなどのスケジューラを使用してHPCにアクセスできる場合は、future.BatchJobs packageを使用できます。

plan(future.BatchJobs::batchjobs_torque) 

PS。未来を創造する一つの理由は、大規模なバイオインフォマティクスをパラレル/分散で行うことでした。

+0

この可能性を持っていただきありがとうございます。私の回避策は今のところうまくいくが、ネイティブな解決策を取ることは、今後のいくつかのプロジェクト(いくつかのHiSeqが実行される)に大きく役立つだろう。グループメンバーとパッケージを共有します。 – jrp355

関連する問題