-1

我試圖在並行代碼中將我的嵌套循環轉換爲foreach。我不明白如何做到這一點。按照我的代碼: 提前謝謝!R:循環嵌套用於與foreach並行更改

setwd("simul") 
IntervalTime <- c(10,15,20) 
ThinIntesity <- c(10,15,20,25) 
MINSTOCKGROW <- c(200,250,300) 
meteoScen <- c("rcp4p5", "rcp8p5") 
Co2mod <- c("CO2_rcp4p5", "CO2_rcp8p5") 
fileSettings <- c("set_co2_on_man_off.txt", "set_co2_on_man_on.txt") 
mapUnc <- data.frame() 
uncerOut <- data.frame() 
mapUncNoMan <- data.frame() 
validation <- list() 

Sample <- getSample(resDE,thin=700,start=0.3*niter,coda=F) 
nSample <- nrow(Sample) 
ValidationOutput <- "./output/" 
#FOR MANAGEMENT CASES 

這裏並行的代碼,但我嘗試了不同的方法,但只有一個核心工作

for (i in 1:length(IntervalTime)){ 
    for(p in 1:length(MINSTOCKGROW)){ 
    for (j in 1:length(ThinIntesity)){ 
     for(z in 1:length(meteoScen)){ 
     for (k in 1:nSample){ 
      # MAP BAYESIAN REFERENCE 
      ps <- createMixWithDefaults(pars = Sample[k, ],defaults = paramDefault, parind) 
      if (meteoScen[z]=="M45"){ 
      #running the model 
      unlink(list.files("./output/Validation",full.names = TRUE),recursive=TRUE) 
      validation <- run3DCMCC(modelrun) 
      validation$annual$MINSTOCKGROW <- MINSTOCKGROW[p] 
      validation$annual$Management <- paste0(meteoScen[z],"_","IV_",IntervalTime[i],"_","IT_",ThinIntesity[j]) 
      validation$annual$CODE <- paste0(meteoScen[z],"_","IV_",IntervalTime[i],"_","IT_",ThinIntesity[j],"_",MINSTOCKGROW[p],"_",validation$annual$YEAR) 
      validation$annual$Thinintensity <- ThinIntesity[j] 
      validation$annual$intervTime <- IntervalTime[i] 

      validation$annual$Meteo <- meteoScen[z] 
      validation$annual$Manage <- "MANAGEMENT" 
      validation$annual$Harv_Wood <- cumsum(validation$annual$C_HW) 
      validation$annual$StockCarbon <- validation$annual$Harv_Wood+validation$annual$STANDING_WOOD 

      # validation$monthly$Date <- as.yearmon(paste0(validation$monthly$YEAR, "-", validation$monthly$MONTH)) 
      # validation$monthly$Management <- paste0("METEO_",meteoScenario[z],"INTERVAL_",IntervalTime[i],"INTENSITY_",ThinIntesity[j]) 
      validationDF <- data.frame(validation$annual) 
      write.table(validationDF, paste0("./dataOut/",meteoScen[z],"_IV_",IntervalTime[i],"_IT_",ThinIntesity[j],"_MINSTCK_",MINSTOCKGROW[p],"_MAN_ON",".txt"),quote = F, sep = "\t",row.names = F,col.names = T) 
      mapUnc <- rbind(mapUnc, validation$annual) 

      } else { 

嵌套循環的內部條件

  ps <- createMixWithDefaults(pars = Sample[k, ],defaults = paramDefault,parind) 
      #running the model 
      unlink(list.files("./output/",full.names = TRUE),recursive=TRUE) 
      validation <- run3DCMCC(modelrun) 
      validation$annual$MINSTOCKGROW <- MINSTOCKGROW[p] 
      validation$annual$Management <- paste0(meteoScen[z],"_","IV_",IntervalTime[i],"_","IT_",ThinIntesity[j]) 
      validation$annual$CODE <- paste0(meteoScen[z],"_","IV_",IntervalTime[i],"_","IT_",ThinIntesity[j],"_",validation$annual$YEAR) 
      validation$annual$Thinintensity <- ThinIntesity[j] 
      validation$annual$intervTime <- IntervalTime[i] 
      validation$annual$Meteo <- meteoScen[z] 
      validation$annual$Manage <- "MANAGEMENT" 
      validation$annual$Harv_Wood <- cumsum(validation$annual$C_HW) 
      validation$annual$StockCarbon <- validation$annual$Harv_Wood+validation$annual$STANDING_WOOD 

      validationDF <- data.frame(validation$annual) 
      write.table(validationDF, paste0("./dataOut/",meteoScen[z],"_","IV_",IntervalTime[i],"_","IT_",ThinIntesity[j],"_MAN_ON",".txt"),quote = F, sep = "\t",row.names = F,col.names = T) 

rbind所有運行模式

mapUnc <- rbind(mapUnc, validation$annual) 

      } 
     } 
     } 
    } 
    } 
} 

回答

0

其實,你可能不需要任何for循環。在你的輸入向量上考慮expand.grid,它返回所有可能組合的data.frame。然後,運行Mapmapply的變體)通過構建驗證FD的函數迭代地並以元素方式傳遞列值。然後Map()將返回等於擴展網格df的行的數據幀列表(即,所有組合)。

當然,由於您沒有提供可重現的例子,未知的庫和函數調用,下面只是過程的簡圖。您的if/else條件看起來幾乎相同,但下面是if條款的重寫。此外,某些行看起來多餘,因爲ps從未使用過對象(因此示例未在下面引入)。可能ps綁定到modelrun?並且unlink()看起來不會影響循環中的項目:

IntervalTime <- c(10,15,20)   # passed as i variable in fct. via Map() 
ThinIntesity <- c(10,15,20,25)  # passed as t variable in fct. via Map() 
MINSTOCKGROW <- c(200,250,300)  # passed as g variable in fct. via Map() 
meteoScen <- c("rcp4p5", "rcp8p5") # passed as m variable in fct. via Map() 

loopdf <- expand.grid(IntervalTime=IntervalTime, 
         ThinIntensity=ThinIntesity, 
         MINSTOCKGROW=MINSTOCKGROW, 
         meteoScen=meteoScen) 

createValidationDF <- function (i, t, g, m) { 

    validation <- run3DCMCC(modelrun) 
    validation$annual$MINSTOCKGROW <- g 
    validation$annual$Management <- paste0(m,"_","IV_", i,"_","IT_", t) 
    validation$annual$CODE <- paste0(m,"_","IV_",i,"_","IT_", t,"_",g,"_", 
            validation$annual$YEAR) 
    validation$annual$Thinintensity <- t 
    validation$annual$intervTime <- i 

    validation$annual$Meteo <- m 
    validation$annual$Manage <- "MANAGEMENT" 
    validation$annual$Harv_Wood <- cumsum(validation$annual$C_HW) 
    validation$annual$StockCarbon <- validation$annual$Harv_Wood+validation$annual$STANDING_WOOD 

    validationDF <- data.frame(validation$annual) 

    write.table(validationDF, paste0("./dataOut/", m ,"_IV_", i,"_IT_", t,"_MINSTCK_", g,"_MAN_ON",".txt"), 
       quote = F, sep = "\t",row.names = F,col.names = T) 

    return(validationDF) 
} 

df_List <- Map(createValidationDF, loopdf$IntervalTime, loopdf$ThinIntensity, 
            loopdf$MINSTOCKGROW, loopdf$meteoScen) 

mapUnc <- do.call(rbind, df_List)