嵌套的R foreach循环中的外循环变量

问题描述:

我想在嵌套循环中使用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),所以我们可以重现它) – 2012-03-12 21:31:33

问题是您错误地应用了%:%运算符。它旨在合并两个对象,产生一个可用于反复评估提供给它的任何表达式的单个对象。所以,如果你想使用%:%,你需要第一合并两个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 2012-03-19 20:13:29

+2

很高兴听到。顺便说一句,如果您想了解更多关于如何构建嵌套循环的决定,请在R命令行键入'vignette(“嵌套”)'。 – 2012-03-19 20:22:05

+1

注意到小插图显示了正确的方式来做到这一点并且明确声明它是一个二元运算符,但是很容易犯这个错误是很痛苦的。 – 2014-01-17 07:51:05