R: параллельный foreach для имен списков не работает, но обычный цикл успешно выполняется - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь запустить 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]

}

, тогда она будет успешно выполнена, хотяпоследовательно.

Что я делаю не так?

...