我正在try 使用foreach
和doParallel
实现嵌套的for循环,但我不想循环遍历所有值的组合.基本上,我有一个正方形数据集,我想对每一对值运行一个函数,但我不需要重复--例如,我需要计算[1,2]的函数,但不计算[2,1]的函数,因为结果是相同的.这里是一个非常基本的示例,但请注意,由于实际函数/计算的复杂性,我try 使用doParalle.
bvec <- seq(1,10,1)
avec <- seq(1,10,1)
x <- data.frame()
for (i in 1:10) {
for (j in i:10) {
x[i,j] <- sim(avec[i], bvec[j])
}
}
x
原始数据集大约是1800 x 1800,如果我进行所有的成对计算,这将导致超过320万次计算,这是不必要的.以下是我为foreach
名选手准备的:
cl <- parallel::makeCluster(detectCores()-4)
doParallel::registerDoParallel(cl)
clusterExport(cl, list("bvec","avec"))
z <-
foreach(i=1:10, .combine="cbind") %:%
foreach(j=i:10) %dopar% {
x[i,j] <- sim(avec[i], bvec[j])
}
z
parallel::stopCluster(cl)
是否有可能使用foreach
来限制迭代次数?如果没有,有没有其他方法来优化这个过程?
我已try 将Foreach语句更改为
foreach(i=1:10, .combine="cbind") %:%
foreach(j=i:10) %dopar% {
x[i,j] <- sim(avec[i], bvec[j])
}
但这显然行不通.