保存foreach dopar环路的多个输出

我想知道是否/如何能够返回多个输出作为每个dopar循环的一部分

让我们举一个非常简单的例子。假设我想做两个操作作为foreach循环的一部分,并想为I的每个值返回或保存两个操作的结果

对于只返回一个输出,它将非常简单:

库(foreach)
图书馆(双平行)
cl<-makeCluster(3)
注册数字并行(cl)
操作1<-foreach(i=1:100000)%dopar%{
i+2
}

oper1将是一个包含100000个元素的列表,每个元素都是i的每个值的操作i+2的结果

假设现在我想分别返回或保存两个不同操作的结果,例如I+2I+3。我尝试了以下方法:

oper1=list()
操作2<-foreach(i=1:100000)%dopar%{
操作1[[i]]=i+2
返回(i+3)
}

希望i+2的结果将保存在列表oper1中,并且foreach将返回第二次操作i+3的结果。但是,列表中没有填充任何内容oper1!在这种情况下,循环只返回i+3的结果

是否有办法将两个输出返回或保存在两个单独的列表中

不要试图在foreach或任何其他并行程序包中使用副作用。相反,从列表中的foreach循环体返回所有值。如果希望最终结果是两个列表的列表,而不是100000个列表的列表,请指定一个转换结果的组合函数:

comb<-函数(x,…){
搭接(沿(x)方向的顺序),
函数(i)c(x[[i]],lappy(list(…),函数(y)y[[i]]))
}
操作<-foreach(i=1:10,.combine='comb',.multicombine=TRUE,
.init=list(list(),list())%dopar%{
清单(i+2、i+3)
}
操作1<-操作[[1]]
操作2<-操作[[2]]

请注意,此联合收割机函数需要使用.init参数为首次调用联合收割机函数设置x的值

发表评论