让我们假设我们声明此功能:
f <- function(x) u + x
现在,如果我调用 f(10)
r,将查找父环境以递归的 u
值,直到到达全局环境,如果返回了一个值,则返回了 u + 10
,否则我们会遇到错误。到目前为止还不错。
现在假设我们有一个池,我们想从f
的体内拉未知值,例如pool <- list(u = 10)
或带有u
设置的环境变量。
您将如何将u
值注入通用函数f
?您可以编写一个函数,以注入pool
中f
中定义的变量?换句话说,我们可以指向要寻找缺失变量的方向而不是在父环境中递归查找?
编辑:我知道我当然可以执行此f <- function(x) pool[["u"]] + x
,但是我正在寻找上述行为。
编辑:用例就是:我正在构建一个库,允许用户配置他们想要优化的功能,我希望允许它们使用加载库时已经计算的某些变量(某些微分方程的解决方案)并根据自己的意愿结合它们。因此,我想对它们进行尽可能透明的过程,让他们在功能正文中使用可变值u
而不是pool$u
。
1)重置环境将pool
转换为环境,并将f
的环境设置为:
# inputs
pool <- list(u = 10)
f <- function(x) u + x
environment(f) <- list2env(pool, parent = environment(f))
f(1)
## [1] 11
2)Proto 另一种可能性是使用原始软件包。原始对象是具有修改方法的环境。将pool
转换为原始对象p
,然后将f
插入其中。将f
插入p
将其环境重置为p
:
library(proto)
p <- as.proto(pool, parent = environment(f))
p$f <- f
with(p, f(10)) # use the version of f inserted into p
## [1] 11
,或者我们可以用p
中的f
覆盖f
:
library(proto)
p <- as.proto(pool, parent = environment(f))
p$f <- f
f <- with(p, f)
f(1)
## [1] 11
更新:设置了从pool
形成的新环境的父母,以f
的原始环境形成,以便在f
中的自由变量首先在pool
形成的环境中查找,然后在f
的环境中查找。订单而不是从pool
派生的环境,然后是父框架。