首页 > 解决方案 > R:保存到 %dopar% / 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

标签: rlistbioinformaticsdoparallelparallel-foreach

解决方案


推荐阅读