R: Defer Evaluation of an Expression

defer {withr} | R Documentation

## 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"))

### 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.

### Author(s)

Kevin Ushey

### 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()))
    })

[Package withr version 2.1.1 Index]