R: Значения, сохраненные в списке в% dopar% / foreach, недоступны в глобальном окружении - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь запустить следующий код параллельно, используя dopar / foreach, но я не могу понять, как на самом деле сохранить значения в списке и отобразить их в глобальной среде ниже вscript.

У меня есть первая строка кода для инициализации списка seurat.object.Я импортирую список в foreach.и присвоение нового значения каждому из элементов списка там, используя <<-, что должно означать, что оно будет сохранено в глобальной среде.Почему обновленный список seurat.objects не сохраняется за пределами foreach?


1a.Только шкала (без регрессии NUMI):

1b.Масштабирование с использованием регрессии NUMI и сохранение в новом объекте:

seurat.objects <- list(scaled=NULL, scaled.regressed=NULL)

registerDoFuture()
cl <- makeCluster(2, outfile="")
plan(cluster, workers = cl)

result <- foreach(object=names(seurat.objects), 
           .export = ls(.GlobalEnv)) %dopar% {


   selectObject(object)

   if( ! file.exists(object.path)) {

         if(object == "scaled") {

             assign('seurat.objects[["scaled"]]', ScaleData(seurat.object, 
                    do.scale = T, do.center = T,  display.progress = F))

          }

         if(object == "scaled.regressed") {

          assign('seurat.objects[["scaled.regressed"]]',
          ScaleData(seurat.object,
          vars.to.regress = "nUMI", 
          do.scale = T, do.center = T, display.progress = F))

          }

      saveRDS(seurat.objects[[object]], file=object.path)

      } else { # Found scaled .Rds

               x <- readRDS(object.path)

              seurat.objects[[object]] <<- x

              rm(x)

        }

    }

stopCluster(cl)

Функция selectObject определена перед указанным кодом следующим образом:

selectObject <- function(object) {

      if(object == "scaled") {
                             scaling <<- "_scaleOnly"
                             pca.result <<- "pca.scaled"
                             object.path <<- path.scaled.object
                             pca.result.path <<- paste0(clustering.path, "2_pca/pcaObject_", 
                                            age, scaling, ".Rds")
                            } 

      if(object == "scaled.regressed") {

                                scaling <<- "_scale_nUMIregress"
                                pca.result <<- "pca.scaled.regressed"
                                object.path <<- path.scaled.regressed.object
                                pca.result.path <<- paste0(clustering.path, "2_pca/pcaObject_", 
                                            age, scaling, ".Rds")
                            }
}

Когда я пытаюсь проверить содержимое seurat.objects, список, в котором должны были храниться данные, я получаю:

> seurat.objects

$scaled
NULL

$scaled.regressed
NULL
...