我们假设我们声明了这个函数:
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
。
答案 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
到父框架的环境。