虽然看起来很奇怪,但您可以在 foreach 循环体中使用 return,而无需辅助函数(如 @Aaron 所示):
r <- foreach(i = 1:10, .combine='c') %dopar% {
n <- i + floor(runif(1, 0, 9))
if (n %% 3) return(NULL)
n
}
在此示例中返回 NULL,因为它已被 c 函数过滤掉,这可能很有用。
此外,虽然它不适用于您的示例,但 when 函数有时可以代替 next,并且对于完全阻止计算发生很有用:
r <- foreach(i=1:5, .combine='c') %:%
foreach(j=1:5, .combine='c') %:%
when (i != j) %dopar% {
10 * i + j
}
内部表达式只计算 20 次,而不是 25 次。这对于嵌套的 foreach 循环特别有用,因为 when 可以访问所有上游迭代器值。
更新
如果要在返回列表结果时过滤掉NULLs,则需要编写自己的组合函数。这是一个完整的示例,演示了一个与默认组合函数类似但包含过滤机制的组合函数:
library(doSNOW)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)
filteredlist <- function(a, ...) {
values <- list(...)
c(a, values[! sapply(values, is.null)])
}
r <- foreach(i=1:200, .combine='filteredlist', .init=list(),
.multicombine=TRUE) %dopar% {
# filter out odd values of i
if (i %% 2) return(NULL)
i
}
请注意,当任务结果超过 100 个时,此代码可以正常工作(100 是 .maxcombine 选项的默认值)。