r - 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
解决方案
推荐阅读
- angular - angular-handsontable 显示十进制值
- javascript - 如何在函数中使用 this.id
- php - SQL database on GitHub using PHP
- python - 从 Scrapy 将数据插入数据库时使用 Django 信号
- c# - Percentage to Factor
- sql - PostgreSQL / Oracle => 查询对分层值进行分组和计数
- python - Pandas DataFrame subtract a series using groupby classification
- mongodb - Calculate Average Duration from a Series of Dates
- php - How change column in laravel model?
- scala - 玩 Akka Actors 网络和非网络应用程序一起工作