【问题标题】:Get multiple values out of parallel foreach loop从并行 foreach 循环中获取多个值
【发布时间】:2021-01-31 08:53:14
【问题描述】:

我已经尝试过搜索,但没有找到任何让我一路走来的东西。

我正在三个栅格的堆栈上运行占用预测模型。由于需要进行大量处理,我正在使用并行 foreach 循环。

我需要从循环的结果中检索三个变量:test、na 和 pred。我需要这三个值来填充新的栅格值并保持相同的范围。除非有人知道如何填补处理过程中 NA 值造成的空白?

以下是我根据找到的帖子尝试使用的代码。 我也尝试过嵌套 foreach 循环,但我不确定我是否理解它们是如何工作的,或者这是否能达到我的目的。

library(parallel)
library(doSNOW)

multiResultClass<- function(test = NULL, tmp = NULL, na = NULL, pred = NULL){
  results<- list(
    test = test,
    tmp = tmp,
    na = na,
    pred = pred
  )
  class(results)<- append(class(results), "multiResultClass")
  return(results)
}

nc<- detectCores()-1
cl<- makeCluster(nc)
registerDoSNOW(cl)

predicts<- foreach (i = 1:nrow(pm), .multicombine = T, .maxcombine = 1000,
         .packages = c("unmarked", "raster"), .verbose = T)%dopar%{
           
            results<- multiResultClass()
           
           test<- cellFromRow(pm, i)
           tmp<- data.frame(pm[test])
           na<- any(is.na(tmp[i, ]))
           
           if(length(which(na) != nrow(tmp))){
             pred<- predict(fmBest, "state", tmp)
           }
           results$test<- test
           results$tmp<- tmp
           results$na<- na
           results$pred<- pred
           return(results)
         }

foreach(i = 1:nrow(pm))%do%{
  
test<- predicts[[i]]$test
na<- predicts[[i]]$na
pred<- predicts[[i]]$pred
}

stopCluster(cl)

我有一个有效的 foreach 循环,可以让我获得 pred 值,但没有测试和 na,我还没有找到正确填写数据需要进入的栅格模板的方法。该 foreach 循环如下:

library(parallel)
library(doSNOW)


ns<- detectCores()-1
cl<- makeCluster(ns);cl
registerDoSNOW(cl)

predictions<- 
  foreach (i = 1:nrow(pm), .multicombine = T, .maxcombine = 5000,
           .packages = c("unmarked", "raster"), .verbose = T)%dopar%{
   
                 test<- cellFromRow(pm, i)
                 tmp<- data.frame(pm[test])
                 na<- any(is.na(tmp[i, ]))
                 
                 if(length(which(na) != nrow(tmp))){
                 predict(fmBest, "state", tmp)
}

}

stopCluster(cl)

【问题讨论】:

    标签: r parallel-processing parallel-foreach


    【解决方案1】:

    我终于找到了一个可以使用的组合函数。下面是我使用的代码,它在一个大列表中返回 test、na 和 pred 的值。

    library(doSNOW)
    
    nc<- detectCores()-1
    cl<- makeCluster(nc);cl
    registerDoSNOW(cl)
    
    comb<- function(...){
      mapply('rbind', ..., SIMPLIFY = F)
    }
    
    predictions<- foreach(i = 1:nrow(pm), .combine = 'comb', .multicombine = T,
              .maxcombine = 200, .packages = c("unmarked", "raster"), .verbose = T,
              .inorder = F)%dopar%{ 
                
            #get cell number values from raster stack
                test<- cellFromRow(pm, i)
                
                # make into a data.frame for prediction
                tmp<- data.frame(pm[test])
                
                # test which are na
                na<- any(is.na(tmp[i, ]))
                
                # avoid NA values entering the predict function
                if(length(which(na)) != nrow(tmp)){
    
                  #   # Predict the new data
                  pred<- predict(fmBest, "state", tmp)
                  
                }
    
                list(test, na, pred)  
                
               }
    stopCluster(cl)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多