mlr3misc (version 0.1.6)

encapsulate: Encapsulate Function Calls for Logging

Description

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().

  • "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.

Usage

encapsulate(
  method,
  .f,
  .args = list(),
  .opts = list(),
  .pkgs = character(),
  .seed = NA_integer_
)

Arguments

method

:: character(1) One of "none", "evaluate" or "callr".

.f

:: function() Function to call.

.args

:: list() Arguments passed to .f.

.opts

:: named list() Options to set for the function call. Options get reset on exit.

.pkgs

:: character() Packages to load (not attach).

.seed

:: integer(1) Random seed to set before invoking the function call. Gets reset to the previous seed on exit.

Value

(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()).

Examples

Run this code
# NOT RUN {
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)
encapsulate("evaluate", f, list(n = 1), .seed = 1)
encapsulate("callr", f, list(n = 1), .seed = 1)
# }

Run the code above in your browser using DataLab