Я пытаюсь запустить следующий код параллельно, используя dopar
/ foreach
, но я не могу понять, как на самом деле сохранить значения в списке и отобразить их в глобальной среде ниже вscript.
У меня есть первая строка кода для инициализации списка 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