2012-03-12 10 views
6

मैं नेस्टेड लूप में फ़ोरैच पैकेज का उपयोग करने की कोशिश कर रहा हूं, लेकिन मेरा आंतरिक पाश बाहरी काउंटर को पहचान नहीं पा रहा है, मुझे क्या याद आ रही है?नेस्टेड आर फोरैच लूप में बाहरी लूप वैरिएबल

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 में क्या है (आप डंप (v2) का उपयोग कर सकते हैं ताकि हम इसे पुन: उत्पन्न कर सकें) –

उत्तर

16

समस्या यह है कि आप गलत तरीके से आवेदन कर रहे हैं %:% ऑपरेटर है। यह एक foreach उद्देश्य यह है कि करने के लिए इस्तेमाल किया जा सकता बार-बार का मूल्यांकन जो कुछ भी अभिव्यक्ति आप इसे करने के लिए आपूर्ति में जिसके परिणामस्वरूप दो foreach वस्तुओं विलय करने के लिए बनाया गया है,। तो, आप %:% उपयोग करना चाहते हैं, आप के लिए पहले विलय दो foreach() बयानों और की जरूरत है, तो जिसके परिणामस्वरूप ऑब्जेक्ट का उपयोग %do% के लिए एक एकल कॉल ड्राइव करने के लिए (या अपने मामले, %dopar% में)। एक उदाहरण के लिए नीचे (1) देखें।

वैकल्पिक रूप से, अगर आप दो foreach() वस्तुओं घोंसला करना चाहते हैं, %do% दो बार उपयोग करते हैं, में के रूप में (2) नीचे

किसी भी तरह से काम करता है, हालांकि समांतर नौकरियों के लिए मैं %:% का उपयोग कर एक को पसंद कर सकता हूं। आपका कोड है, हालांकि, जैसे (3) नीचे, को जोड़ती है दो रणनीतियों के तत्वों एक संकर है कि कुछ नहीं कर सकते उत्पादन करने के लिए।

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

हाय जोश, आपके उत्तर के लिए धन्यवाद अब यह काम करता है! – user1265067

+2

सुनने के लिए अच्छा है। वैसे, यदि आप नेस्टेड लूप को कैसे व्यवस्थित करना चाहते हैं, इसमें शामिल कुछ निर्णयों के बारे में अधिक पढ़ना चाहते हैं, तो आर कमांड लाइन पर 'vignette ("नेस्टेड") टाइप करें। –

+1

यह ध्यान देने योग्य है कि विग्नेट इसे करने का सही तरीका दिखाता है, और स्पष्ट रूप से कहता है कि यह एक बाइनरी ऑपरेटर है, लेकिन यह गलती करना इतना आसान है। –

संबंधित मुद्दे