繁体   English   中英

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

[英]Outer loop variable in nested R foreach loop

我试图在嵌套循环中使用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)
    }
}

问题是您错误地应用%:%运算符。 它旨在合并两个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM