在R函数环境中自动注入变量

  • 本文关键字:注入 变量 函数 环境 r
  • 更新时间 :
  • 英文 :


让我们假设我们声明此功能:

f <- function(x) u + x

现在,如果我调用 f(10) r,将查找父环境以递归的 u值,直到到达全局环境,如果返回了一个值,则返回了 u + 10,否则我们会遇到错误。到目前为止还不错。

现在假设我们有一个池,我们想从f的体内拉未知值,例如pool <- list(u = 10)或带有u设置的环境变量。

您将如何将u值注入通用函数f?您可以编写一个函数,以注入poolf中定义的变量?换句话说,我们可以指向要寻找缺失变量的方向而不是在父环境中递归查找?

编辑:我知道我当然可以执行此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派生的环境,然后是父框架。

最新更新