
Last chance! 50% off unlimited learning
Sale ends in
Evaluates a function while both recording an output log and measuring the elapsed time. There are currently three different modes implemented to encapsulate a function call:
"none"
: Just runs the call in the current session and measures the elapsed time.
Does not keep a log, output is printed directly to the console.
Works well together with traceback()
.
"try-catch"
: Similar to "none"
, but catches error. Output is printed to the console and
not logged.
"evaluate"
: Uses the package evaluate to call the function, measure time and do the logging.
"callr"
: Uses the package callr to call the function, measure time and do the logging.
This encapsulation spawns a separate R session in which the function is called.
While this comes with a considerable overhead, it also guards your session from being teared down by segfaults.
encapsulate(
method,
.f,
.args = list(),
.opts = list(),
.pkgs = character(),
.seed = NA_integer_,
.timeout = Inf
)
(named list()
) with three fields:
"result"
: the return value of .f
"elapsed"
: elapsed time in seconds. Measured as proc.time()
difference before/after the function call.
"log"
: data.table()
with columns "class"
(ordered factor with levels "output"
, "warning"
and "error"
) and "message"
(character()
).
(character(1)
)
One of "none"
, "evaluate"
or "callr"
.
(function()
)
Function to call.
(list()
)
Arguments passed to .f
.
(named list()
)
Options to set for the function call. Options get reset on exit.
(character()
)
Packages to load (not attach).
(integer(1)
)
Random seed to set before invoking the function call.
Gets reset to the previous seed on exit.
(numeric(1)
)
Timeout in seconds. Uses setTimeLimit()
for "none"
and "evaluate"
encapsulation.
For "callr"
encapsulation, the timeout is passed to callr::r()
.
f = function(n) {
message("hi from f")
if (n > 5) {
stop("n must be <= 5")
}
runif(n)
}
encapsulate("none", f, list(n = 1), .seed = 1)
if (requireNamespace("evaluate", quietly = TRUE)) {
encapsulate("evaluate", f, list(n = 1), .seed = 1)
}
if (requireNamespace("callr", quietly = TRUE)) {
encapsulate("callr", f, list(n = 1), .seed = 1)
}
Run the code above in your browser using DataLab