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

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

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


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

1б. Масштабируйте с помощью регрессии 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

0 ответов

Другие вопросы по тегам