Aliases: env_bind env_bind_lazy env_bind_active %<~%
Keywords:
### ** Examples # env_bind() is a programmatic way of assigning values to symbols # with `<-`. We can add bindings in the current environment: env_bind(current_env(), foo = "bar") foo
[1] "bar"
# Or modify those bindings: bar <- "bar" env_bind(current_env(), bar = "BAR") bar
[1] "BAR"
# You can remove bindings by supplying zap sentinels: env_bind(current_env(), foo = zap()) try(foo)
Error in try(foo) : object 'foo' not found
# Unquote-splice a named list of zaps zaps <- rep_named(c("foo", "bar"), list(zap())) env_bind(current_env(), !!!zaps) try(bar)
Error in try(bar) : object 'bar' not found
# It is most useful to change other environments: my_env <- env() env_bind(my_env, foo = "foo") my_env$foo
[1] "foo"
# A useful feature is to splice lists of named values: vals <- list(a = 10, b = 20) env_bind(my_env, !!!vals, c = 30) my_env$b
[1] 20
my_env$c
[1] 30
# You can also unquote a variable referring to a symbol or a string # as binding name: var <- "baz" env_bind(my_env, !!var := "BAZ") my_env$baz
[1] "BAZ"
# The old values of the bindings are returned invisibly: old <- env_bind(my_env, a = 1, b = 2, baz = "baz") old
$a [1] 10 $b [1] 20 $baz [1] "BAZ"
# You can restore the original environment state by supplying the # old values back: env_bind(my_env, !!!old) # env_bind_lazy() assigns expressions lazily: env <- env() env_bind_lazy(env, name = { cat("forced!\n"); "value" }) # Referring to the binding will cause evaluation: env$name
forced!
[1] "value"
# But only once, subsequent references yield the final value: env$name
[1] "value"
# You can unquote expressions: expr <- quote(message("forced!")) env_bind_lazy(env, name = !!expr) env$name
NULL
# By default the expressions are evaluated in the current # environment. For instance we can create a local binding and refer # to it, even though the variable is bound in a different # environment: who <- "mickey" env_bind_lazy(env, name = paste(who, "mouse")) env$name
[1] "mickey mouse"
# You can specify another evaluation environment with `.eval_env`: eval_env <- env(who = "minnie") env_bind_lazy(env, name = paste(who, "mouse"), .eval_env = eval_env) env$name
[1] "minnie mouse"
# Or by unquoting a quosure: quo <- local({ who <- "fievel" quo(paste(who, "mouse")) }) env_bind_lazy(env, name = !!quo) env$name
[1] "fievel mouse"
# You can create active bindings with env_bind_active(). Active # bindings execute a function each time they are evaluated: fn <- function() { cat("I have been called\n") rnorm(1) } env <- env() env_bind_active(env, symbol = fn) # `fn` is executed each time `symbol` is evaluated or retrieved: env$symbol
I have been called
[1] -0.3036575
env$symbol
I have been called
[1] -0.7771353
eval_bare(quote(symbol), env)
I have been called
[1] 0.07768824
eval_bare(quote(symbol), env)
I have been called
[1] -0.4226721
# All arguments are passed to as_function() so you can use the # formula shortcut: env_bind_active(env, foo = ~ runif(1)) env$foo
[1] 0.9710962
env$foo
[1] 0.7394802