I'm new to using foreach() %dopar% for paralleling, and I have some problems about how it handles errors or warnings.
when I use try() with my customized error message within foreach() %dopar%, the "native" error message doesn't show up:
test <- function(x) { if (x==2) "a"/2 } foreach(i=1:3) %dopar% { tryout <- try(test(i)) if (class(tryout)=="try-error") print("Error!") }
In this case the "native" error message:
Error in "a"/2 : non-numeric argument to binary operator
doesn't show up, and only theError!
from try() error catching will be printed. However both error messages will be printed when not using foreach() %dopar%. So how to make both error messages show up?In the above case, when there are warnings, whether additional to errors or not, the warning messages are not printed, for example with the same foreach() block as above and the
test()
below:test <- function(x) { if (x==2) warning("Warning!") }
So how to show the warnings?
p.s. I found that if I simply use try(test(i)) within %dopar% then the "native" error messages and the warnings will be printed, but I do want to include my own error message in real-life situations. I also tried using tryCatch()
instead of try()
, but it didn't solve the problem.
Thanks!
I think the issue is around your errorhandling and a bit of a misunderstanding of dopar. First, think of dopar more like a function. It must return an object back to the user by default as a list (it gathers all the output from each worker and the foreach function gathers these and returns them to use, see 'output_list' below).
You can also set .errorhandling = 'pass', it will return the error back to the output object (note probably only works if .combine ='list'). Here is how .errorhandling works:
Here is an example of how to set up a tryCatch inside of a foreach. Note that errors are now stored in output_list.