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

时间:2017-12-24 09:00:14

标签: r

我们假设我们声明了这个函数:

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中定义的变量吗?换句话说,我们可以指向R在哪个方向寻找缺失的变量而不是在父环境中递归查找?

编辑:我知道我当然可以这样做u,但我正在寻找上述行为。

编辑:用例如下:我构建了一个允许用户配置他们想要优化的函数的库,我希望它们可以使用库中已经计算的某些变量。加载(某些微分方程的解)并根据需要组合它们。因此,我希望让流程尽可能透明,如果可能的话,让他们在函数体中使用变量值pool$u而不是originalRequest

1 个答案:

答案 0 :(得分:2)

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 另一种可能性是使用proto包。 proto对象是具有修改方法的环境。将pool转换为proto对象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

或我们可以使用f中的f版本覆盖p

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的环境形成,而不是从 watch *0x7ff67eefe300 到父框架的环境。