These functions dispatch internally with methods for functions, formulas and frames. If called with a missing argument, the environment of the current evaluation frame (see ctxt_stack()) is returned. If you call get_env() with an environment, it acts as the identity function and the environment is simply returned (this helps simplifying code when writing generic functions for environments).

get_env(env = caller_env(), default = NULL)

set_env(env, new_env = caller_env())



An environment or an object bundling an environment, e.g. a formula, quosure or closure.


The default environment in case env does not wrap an environment. If NULL and no environment could be extracted, an error is issued.


An environment to replace env with. Can be an object handled by get_env().


# Get the environment of frame objects. If no argument is supplied, # the current frame is used: fn <- function() { list( get_env(call_frame()), get_env() ) } fn()
#> [[1]] #> <environment: 0x7f97a082d188> #> #> [[2]] #> <environment: 0x7f97a082d188> #>
# Environment of closure functions: get_env(fn)
#> <environment: 0x7f97a085fb78>
# Or of quosures or formulas: get_env(~foo)
#> <environment: 0x7f97a085fb78>
#> <environment: 0x7f97a085fb78>
# Provide a default in case the object doesn't bundle an environment. # Let's create an unevaluated formula: f <- quote(~foo) # The following line would fail if run because unevaluated formulas # don't bundle an environment (they didn't have the chance to # record one yet): # get_env(f) # It is often useful to provide a default when you're writing # functions accepting formulas as input: default <- env() identical(get_env(f, default), default)
#> [1] TRUE
# set_env() can be used to set the enclosure of functions and # formulas. Let's create a function with a particular environment: env <- child_env("base") fn <- set_env(function() NULL, env) # That function now has `env` as enclosure: identical(get_env(fn), env)
#> [1] TRUE
identical(get_env(fn), get_env())
#> [1] FALSE
# set_env() does not work by side effect. Setting a new environment # for fn has no effect on the original function: other_env <- child_env(NULL) set_env(fn, other_env)
#> function() NULL #> <environment: 0x7f979bb70150>
identical(get_env(fn), other_env)
#> [1] FALSE
# Since set_env() returns a new function with a different # environment, you'll need to reassign the result: fn <- set_env(fn, other_env) identical(get_env(fn), other_env)
#> [1] TRUE