我正在尝试使用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