Useful to represent functions efficiently within repr()
.
crate_env(fun, namespace = "R_GlobalEnv", ..., selfref = NULL)
(function
)
Function of which the environment should be set.
(character(1)
)
Name of the namespace, as given by environmentName()
,
to be used as the (parent of the) environment of fun
. Special values
"R_GlobalEnv"
(global environment), "R_BaseEnv"
(base environment;
note this one is non-standard within R), "R_EmptyEnv"
(empty environment).
The content of the namespace is not modified. Default "R_GlobalEnv"
.
(list
)
Content of environments within which to place fun
.
(character(1)
| named integer
| NULL
)
If character(1)
: The name of the entry of the first element in ...
that
refers to the function itself. If a named integer
, then the values
indicate the lists in ...
where the reference to the function should be
placed see examples. Default NULL
: No reference to the function itself is
present.
function
: The given fun
with changed environment.
identity2 = crate_env(function(x) x, "base")
identical(identity, identity2) # TRUE
#> [1] TRUE
y = 1
f1 = mlr3misc::crate(function(x) x + y, y, .parent = .GlobalEnv)
f2 = crate_env(function(x) x + y, "R_GlobalEnv", list(y = 1))
# Note identical() does not apply because both contain (equal, but not
# identical) 'y = 1'-environments
all.equal(f1, f2) # TRUE
#> [1] TRUE
f1(10) # 10 + 1 == 11
#> [1] 11
factorial1 = mlr3misc::crate(
function(x) if (x > 0) x * factorial1(x - 1) else 1,
y, .parent = .GlobalEnv
)
environment(factorial1)$factorial1 = factorial1
factorial2 = crate_env(
function(x) if (x > 0) x * factorial1(x - 1) else 1,
"R_GlobalEnv", list(y = 1), selfref = "factorial1")
# putting 'factorial1' into the list (or repeating function(x) ....)
# would *not* work, since we want:
identical(environment(factorial2)$factorial1, factorial2) # TRUE
#> [1] TRUE
all.equal(factorial1, factorial2) # TRUE
#> [1] TRUE
g = crate_env(function(x) x + y + z, "miesmuschel",
list(y = 1), list(z = 2), selfref = c(X = 1, Y = 2, Z = 2))
g(0) # 0 + 1 + 2 == 3
#> [1] 3
identical(environment(g)$X, g)
#> [1] TRUE
identical(parent.env(environment(g))$Y, g)
#> [1] TRUE
identical(parent.env(environment(g))$Z, g)
#> [1] TRUE
identical(
parent.env(parent.env(environment(g))),
loadNamespace("miesmuschel")
)
#> [1] TRUE