цикл for со списком и подсписком для цикла foreach

#r #loops #foreach

#r #циклы #foreach

Вопрос:

Я попытался превратить этот for цикл в foreach цикл, чтобы, наконец, запустить его параллельно. Но я думаю, что я неправильно понял концепцию foreach цикла. Я пробовал обходиться с более простыми циклами и всегда застревал.

Упрощенный код исходного цикла for:

 varName <- rep("name",1000)
testlist <- list()
for(j in 1:1000){

testlist [[j]]              <- list()
testlist [[j]]$UsedAlgo     <- "Name"
testlist [[j]]$UsedPMethod  <- varName[j]
testlist [[j]]$datalists    <- list()
testlist [[j]]$datalists    <- lapply(Dataset[[j]]$data,     
                                function(x){#whateverfunction})
  

Мой цикл foreach:

  library(foreach)
 library(doMC)
 registerDoMC(35)
 varName <- rep("name",1000)

 testlist <- foreach(j=1:1000) %dopar% {

 testlist[[j]] <- list()
 testlist[[j]]$UsedAlgo     <- "Name"
 testlist[[j]]$UsedPMethod  <- varName[j]
 testlist[[j]]$patterns     <- list()
 testlist[[j]]$patterns     <- lapply(Dataset[[j]]$data,                
                                      function(x){#whateverfunction})

 }
  

Так что все работает нормально. Он выводит списки, которые возвращаются с помощью #whateverfunction . Но полностью игнорирует другие настройки переменных.

Возвращаемый список представляет собой список размером от 1:1000 с выводом #whateverfunction . Функция является завершенной и возвращает множество списков и написана на C . Вот почему я не прикрепил полностью запущенный пример. Но я могу разобраться, если это необходимо. Но я думаю, что я только что совершил основную ошибку и, возможно, я просто погуглил неправильные теги.

Ответ №1:

Попробуйте testlist[[j]] заменить temp и добавить явный возврат в конце: return(temp) :

 testlist <- foreach(j=1:1000) %dopar% {    
   temp <- list()
   temp$UsedAlgo     <- "Name"
   temp$UsedPMethod  <- varName[j]
   temp$patterns     <- lapply(Dataset[[j]]$data,                
                               function(x){ ... })
   return(temp)
}