我经常会得到几个嵌套的结果foreach
循环,有时在编写通用函数(例如,对于包)时,没有明显可以并行化的级别。有什么方法可以实现下面的模型所描述的内容吗?
foreach(i = 1:I) %if(I < J) `do` else `dopar`% {
foreach(j = 1:J) %if(I >= J) `do` else `dopar`% {
# Do stuff
}
}
此外,是否有某种方法可以检测并行后端是否已注册,以便我可以避免收到不必要的警告消息?这在 CRAN 提交之前检查包时非常有用,并且不会打扰在单核计算机上运行 R 的用户。
foreach(i=1:I) %if(is.parallel.backend.registered()) `dopar` else `do`% {
# Do stuff
}
谢谢你的时间。
Edit:非常感谢您对核心和工作人员的所有反馈,您是对的,处理上述示例的最佳方法是重新考虑整个设置。我更喜欢下面这样的东西triu
想法,但本质上是相同的。当然也可以通过并行来完成tapply
就像乔里斯建议的那样。
ij <- expand.grid(i=1:I, j=1:J)
foreach(i=ij$I, j=ij$J) %dopar% {
myFuction(i, j)
}
然而,在我试图简化引发此线程的情况时,我遗漏了一些关键细节。想象一下我有两个函数analyse
and batch.analyse
并且并行化的最佳级别可能会有所不同,具体取决于n.replicates
and n.time.points
.
analyse <- function(x, y, n.replicates=1000){
foreach(r = 1:n.replicates) %do% {
# Do stuff with x and y
}
}
batch.analyse <- function(x, y, n.replicates=10, n.time.points=1000){
foreach(tp = 1:time.points) %do% {
my.y <- my.func(y, tp)
analyse(x, my.y, n.replicates)
}
}
If n.time.points > n.replicates
并行化是有意义的batch.analyse
但除此之外,并行化更有意义analyse
。关于如何解决它有什么想法吗?是否可以以某种方式检测到analyse
并行化是否已经发生?