R:保存在%dopar%/ foreach中的列表中的值在全局环境中下游不可用

时间:2018-09-21 09:17:16

标签: r list bioinformatics doparallel parallel-foreach

我正在尝试使用dopar / foreach并行运行以下代码,但是我不知道如何将值实际保存到列表中并使它们出现在全局环境中在脚本中更进一步。

我有第一行代码来初始化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

0 个答案:

没有答案