Become an expert in R — Interactive courses, Cheat Sheets, certificates and more!
Get Started for Free

defer

Defer Evaluation of an Expression


Description

Similar to on.exit(), but allows one to attach an expression to be evaluated when exiting any frame currently on the stack. This provides a nice mechanism for scoping side effects for the duration of a function's execution.

Usage

defer(expr, envir = parent.frame(), priority = c("first", "last"))

defer_parent(expr, priority = c("first", "last"))

deferred_run(envir = parent.frame())

deferred_clear(envir = parent.frame())

Arguments

expr

[expression]
An expression to be evaluated.

envir

[environment]
Attach exit handlers to this environment. Typically, this should be either the current environment or a parent frame (accessed through parent.frame()).

priority

[character(1)]
Specify whether this handler should be executed "first" or "last", relative to any other registered handlers on this environment.

Details

defer() works by attaching handlers to the requested environment (as an attribute called "handlers"), and registering an exit handler that executes the registered handler when the function associated with the requested environment finishes execution.

Deferred events can be set on the global environment, primarily to facilitate the interactive development of code that is intended to be executed inside a function or test. A message alerts the user to the fact that an explicit deferred_run() is the only way to trigger these deferred events. Use deferred_clear() to clear them without evaluation. The global environment scenario is the main motivation for these functions.

Examples

# define a 'local' function that creates a file, and
# removes it when the parent function has finished executing
local_file <- function(path) {
  file.create(path)
  defer_parent(unlink(path))
}

# create tempfile path
path <- tempfile()

# use 'local_file' in a function
local({
  local_file(path)
  stopifnot(file.exists(path))
})

# file is deleted as we leave 'local' local
stopifnot(!file.exists(path))

# investigate how 'defer' modifies the
# executing function's environment
local({
  local_file(path)
  print(attributes(environment()))
})

# defer and trigger events on the global environment
defer(print("one"))
defer(print("two"))
deferred_run()

defer(print("three"))
deferred_clear()
deferred_run()

withr

Run Code 'With' Temporarily Modified Global State

v2.4.2
MIT + file LICENSE
Authors
Jim Hester [aut, cre], Kirill Müller [aut], Kevin Ushey [aut], Hadley Wickham [aut], Winston Chang [aut], Jennifer Bryan [ctb], Richard Cotton [ctb], RStudio [cph]
Initial release

We don't support your browser anymore

Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.