-1

Je suis en train de convertir ma boucle imbriquée en code parallèle avec foreach. Je ne comprends pas comment faire ça. suis mon code: merci d'avance !!R: boucle imbriquée avec pour changer en parallèle avec 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 

Voici le code pour la parallélisation, mais j'ai essayé différentes méthodes, mais un seul travail de base

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 { 

une condition à l'intérieur de la boucle imbriquée

  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 pour tous les modèles d'exécution

mapUnc <- rbind(mapUnc, validation$annual) 

      } 
     } 
     } 
    } 
    } 
} 

Répondre

0

En fait, vous n'avez pas besoin de boucle for. Considérez expand.grid sur vos vecteurs d'entrée qui renvoie un data.frame de toutes les combinaisons possibles. Ensuite, exécutez Map (variante de mapply) en passant les valeurs de colonne itérativement et élément par le biais d'une fonction qui génère vaildationDF. Et Map() retournera alors une liste d'images égales aux lignes de la grille d'expansion df (c'est-à-dire toutes les combinaisons).

Bien sûr, puisque vous ne fournissez aucun exemple reproductible, les bibliothèques inconnues et les appels de fonctions ci-dessous sont juste une esquisse du processus. Aussi vos conditions if/else semblent pratiquement identiques, mais ci-dessous est une réécriture de la clause if. De plus, certaines lignes semblent redondantes car ps objet n'est jamais utilisé (d'où L'échantillon n'est pas incorporé ci-dessous). Peut-être ps est liée à modelrun? Et unlink() ne cherche pas à affecter les éléments en boucle:

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)