Параллельная ошибка из-за `withCallingHandlers` - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть параллельный процесс, который выглядит так:

library(foreach)
library(doSNOW)

cl = makeCluster(parallel::detectCores() - 1, type = "SOCK", outfile = "out.txt") 
registerDoSNOW(cl)

l = foreach(i = 1:100) %dopar% { 
  res = withCallingHandlers(
    read.csv("somefilethatdoesntexist.csv"), error = function(e) e)
  if(inherits(res, "error")) res = NULL
  res
}

Я ожидаю, что даже если в «выражении» будет ошибка, цикл должен продолжиться, но он завершится с ошибкой, а полученная переменная «l» не будет создана.

Это, кажется, происходит, особенно в связи с отсутствующими файлами. Но если я обертываю его в tryCatch и обрабатываю соответствующим образом внутри «выражения», как это может привести к ошибке?

1 Ответ

0 голосов
/ 15 ноября 2018

Может быть это (адаптировано с здесь ):

library(foreach)
library(doSNOW)

cl = makeCluster(parallel::detectCores() - 1, type = "SOCK", outfile = "out.txt") 
registerDoSNOW(cl)

l = foreach(i = 1:2) %dopar% { 
  withCallingHandlers({
      res <- withRestarts( read.csv("somefilethatdoesntexist.csv"),
                          skipError=function() return(NULL))
    },
    error=function(e) {saveRDS(e, paste0("E:/temp/", i, ".rds")); invokeRestart("skipError")})
  res
}

l
#[[1]]
#NULL
#
#[[2]]
#NULL

e <- readRDS("E:/temp/1.rds")
e
#<simpleError in file(file, "rt"): cannot open the connection>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...