Problems with try() inside foreach() in R
If you want to use the "remove" or "pass" error handling in foreach
, you don't need to catch the error yourself. Here are the results when setting the error handling to "remove":
> foreach (i = 1:2, .errorhandling = 'remove') %dopar% {+ myfun(i)+ }[[1]][1] 1.314854
Here are the results when using "pass":
> foreach (i = 1:2, .errorhandling = 'pass') %dopar% {+ myfun(i)+ }[[1]][1] 0.7247509[[2]]<simpleError in myfun(i): error>
By using try
, the error is caught and then translated to a "try-error" object by the try
function, hiding the error from foreach
until the the clusterApplyLB
function (which is used to implement the doParallel
backend) notices the "try-error" object in the list of results and throws an error in the master process. I would call that a bug in doParallel
.
Note that the solution given by @LegalizeIt works because it returns a NULL
rather than a "try-error" object, thus avoiding the bug in doParallel
.
You can use tryCatch
and deal with the error appropriately. Here the error is ignored (returning NULL)
results <- foreach (i = 1:2) %dopar% { res <- tryCatch({ myfun(i) }, error=function(e) NULL)}
or just using the builtin .errorhandling='remove'
as you have, without the try
should remove the errors already.