-
Notifications
You must be signed in to change notification settings - Fork 92
Open
Milestone
Description
Idea
> options(error = function() utils::recover())
> foo <- function(x, a = 2) a * x
> f <- future(foo("y"))
> v <- value(f)
Error in a * x : non-numeric argument to binary operator
Enter a frame number, or 0 to exit
1: foo("y")
2: HenrikBengtsson/future-ideas#1: (function ()
utils::recover())()
Selection: 1
Called from: top level
Browse[1]> ls.str()
a : num 2
x : chr "y"
Browse[1]> The idea is to have the future record the full recover stack in the FutureResult object. Something like the info in:
tb <- .traceback(NULL)
if (is.null(tb)) tb <- .traceback(2L)
utils::dump.frames(dumpto = "frames", to.file = FALSE)and then regenerate this call stack when relaying the error on the parent R process. I'm not sure if/not the latter can be done, but if we can figure it out, it'll be super cool.
It might be expensive to transfer all call stacks back from the worker to the main R session when running in parallel, so maybe this needs to be enabled via an option, e.g. options(future.recover.enable = TRUE). It might be that we can enable it by default for sequential futures.
See also
Metadata
Metadata
Assignees
Labels
No labels