Run fn and print result, save arguments and environment on failure. Use on systems like ggplot() where some calculation is delayed until print(). Please see: vignette("DebugFnW", package="wrapr").

DebugPrintFnE(saveDest, fn, ...)

Arguments

saveDest

where to write captured state (determined by type): NULL random temp file, character temp file, name globalenv() variable, and function triggers callback.

fn

function to call

...

arguments for fn

Value

fn(...) normally, but if fn(...) throws an exception save to saveDest RDS of list r such that do.call(r$fn,r$args) repeats the call to fn with args.

See also

Examples

saveDest <- paste0(tempfile('debug'),'.RDS') f <- function(i) { (1:10)[[i]] } # correct run DebugPrintFnE(saveDest, f, 5)
#> [1] 5
#> [1] 5
# now re-run # capture error on incorrect run tryCatch( DebugPrintFnE(saveDest, f, 12), error = function(e) { print(e) })
#> <simpleError in value[[3L]](cond): wrapr::DebugPrintFnE: wrote '/var/folders/7f/sdjycp_d08n8wwytsbgwqgsw0000gn/T//RtmpupYvzx/debug13dd0507c2362.RDS' on catching 'Error in (1:10)[[i]]: subscript out of bounds' #> You can reproduce the error with: #> 'p <- readRDS('/var/folders/7f/sdjycp_d08n8wwytsbgwqgsw0000gn/T//RtmpupYvzx/debug13dd0507c2362.RDS'); do.call(p$fn, p$args, envir= p$env)'>
# examine details situation <- readRDS(saveDest) str(situation)
#> List of 4 #> $ fn :function (i) #> ..- attr(*, "srcref")= 'srcref' int [1:8] 3 6 3 32 6 32 3 3 #> .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x7fc751e838c8> #> $ args :List of 1 #> ..$ : num 12 #> $ env :<environment: 0x7fc751e83548> #> $ fn_name: chr "f"
# fix and re-run situation$args[[1]] <- 6 do.call(situation$fn, situation$args, envir=situation$env)
#> [1] 6
# clean up file.remove(saveDest)
#> [1] TRUE