2012-03-12 18 views
6

ネストループでforeachパッケージを使用しようとしていますが、内側ループがアウターのカウンタを認識しません。ネストされたR foreachループの外側ループ変数

v3 <- search.compounds.by.mass(100.05,0.5) 
foreach(j=2:length(v2)) %:% { 
    foreach(i=1:length(v3), .combine=rbind) %dopar% { 
     write.table(paste(v3[i], paste(get.reactions.by.compound(v3[i]), collapse=" "), sep=" "), "file1",quote=FALSE, row.names=FALSE, col.names=FALSE, append=TRUE) 
     write.table(paste(v3[i], paste(get.pathways.by.compounds(v3[i]), collapse=" "), sep=" "), "file2",quote=FALSE, row.names=FALSE, col.names=FALSE, append=TRUE) 
     v3 <- search.compounds.by.mass(v2[j],0.5) 
    } 
} 
+0

エラーメッセージは何ですか?また、変数v2に何が入っていますか(dput(v2)を使って再現できるようになります) –

答えて

16

問題は、あなたが間違って%:%オペレータを適用しているということです。これは2つのforeachオブジェクトをマージするように設計されており、結果として単一のforeachオブジェクトが提供されます。このオブジェクトを使用して、指定した式を繰り返し評価することができます。あなたが%:%を使用したいのであれば、あなたはに必要な最初の 2つのforeach()文、およびをマージし、その後%do%(またはあなたのケースでは、%dopar%)への単一の呼び出しを駆動するために、結果のオブジェクトを使用します。例として、(1)を参照してください。

また、あなたが巣に2つのforeach()オブジェクトをしたい場合は、以下の(2)のように、二回%do%を使用しています。並列ジョブのために、私は%:%を使用して1を好むかもしれませんが

いずれかの方法では、動作します。しかし、コードは(3)のように、2つの戦略の要素を組み合わせて、何もできないハイブリッドを作り出します。

X <- c("A", "B") 
Y <- 1:3 

## (1) EITHER merge two 'foreach' objects using '%:%' ... 
foreach (j = X, .combine = c) %:% foreach(i = Y, .combine = c) %do% { 
    paste(j, i, sep = "") 
} 
# [1] "A1" "A2" "A3" "B1" "B2" "B3" 


## (2) ... OR Nest two 'foreach' objects using a pair of '%do%' operators ... 
foreach(j = X, .combine = c) %do% { 
    foreach(i = Y, .combine = c) %do% { 
     paste(j, i, sep = "") 
    } 
} 
# [1] "A1" "A2" "A3" "B1" "B2" "B3" 


## (3) ... BUT DON'T use a hybrid of the approaches. 
foreach(j = X, .combine = c) %:% { 
    foreach(i = Y, .combine = c) %do% { 
     paste(j, i, sep = "") 
    } 
} 
# Error in foreach(j = X, .combine = c) %:% { : 
# "%:%" was passed an illegal right operand 
+0

こんにちはJosh、あなたの答えがありがとう! – user1265067

+2

よろしくお願いします。ところで、ネストされたループを構造化する方法に関するいくつかの決定についてもっと知りたい場合は、Rコマンドラインで 'vignette(" nested ")'と打ちます。 –

+1

ビネットには正しい方法が示されており、バイナリ演算子であることが明示されていますが、間違いを犯すのは簡単です。 –

関連する問題