Я пытаюсь запустить PCA на двух больших наборах данных, полученных из одного и того же родительского набора данных ранее в сценарии.Я хотел бы выполнить PCA параллельно на каждом из объектов, но по какой-то причине я не могу заставить его работать.Блок кода работает успешно и выдает ожидаемый результат, если он выполняется с обычным циклом for
, но каждый из них занимает около 1 часа, и я хотел бы воспользоваться возможностями сервера, так как я должен сделать этот бот ~15 наборов данных.
Это мой код:
selectObject <- function(object) {
if(object == "scaled") {
scaling <<- "_scaleOnly"
pca.result <<- "pca.scaled"
object.path <<- path.scaled.object
}
if(object == "scaled.regressed") {
scaling <<- "_scale_nUMIregress"
pca.result <<- "pca.scaled.regressed"
object.path <<- path.scaled.regressed.object
}
}
seurat.objects <- list(scaled=seurat.object.scale,
scaled.regressed=seurat.object.scale.regress
)
library(foreach)
library(doParallel)
cores <- detectCores()
cl <- makeCluster(2)
doParallel::registerDoParallel(cl)
foreach(object=names(seurat.objects)) %dopar% {
print(object)
selectObject(object)
print(paste(object, pca.result, scaling, pca.path))
assign(pca.result,
doFastPCA(t(seurat.objects[[object]]@scale.data))
)
saveRDS(pca.result,
paste0("/path/to/pcaObject.", age, scaling, ".Rds")
)
}
Вышеописанное останавливается навсегда, даже без самого первого вывода print()
, и когда яотменив процесс с помощью ^C
, я получаю следующую ошибку:
Error: "'...' used in an incorrect context"
Но если я заменю строку foreach
на:
for (object in names(seurat.objects)) {
[everything as above]
}
, тогда она будет успешно выполнена, хотяпоследовательно.
Что я делаю не так?