虽然看起来很奇怪,但您可以使用return
在 foreach 循环体中,不需要辅助函数(如@Aaron 所示):
r <- foreach(i = 1:10, .combine='c') %dopar% {
n <- i + floor(runif(1, 0, 9))
if (n %% 3) return(NULL)
n
}
A 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
可以访问所有上游迭代器值。
Update
如果你想过滤掉NULL
当以列表形式返回结果时,您需要编写自己的组合函数。这是一个完整的示例,演示了一个组合函数,其工作方式类似于默认的组合函数,但包含过滤机制:
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
选项)。