-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 루프가 필요하지 않을 수도 있습니다. 모든 가능한 조합 중에서 data.frame을 반환하는 입력 벡터에 expand.grid을 고려하십시오. 그런 다음 (변형은 mapply)을 실행하여 열 값을 반복적으로 전달하고 vaildationDF을 빌드하는 함수를 통해 요소별로 실행합니다. 그리고 Map()은 확장 그리드 df의 행 (즉, 모든 조합)과 동일한 데이터 프레임의 목록을 반환합니다.

물론 재현 할 수없는 예제, 알려지지 않은 라이브러리 및 함수 호출을 제공하지 않으므로 아래에 프로세스의 스케치가 있습니다. 또한 귀하의 if/else 조건은 실질적으로 동일하게 보이지만 아래는 if 조항을 다시 작성한 것입니다. 또한 ps 개체는 사용되지 않으므로 일부 줄이 중복되어 표시됩니다 (따라서 샘플은 아래에 통합되지 않음). 가능하면 ps모델 실행에 연결됩니까? 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)