引用列表中的函数

时间:2016-09-03 18:36:30

标签: r

我有一个函数列表,我希望能够在不将它们作为独立对象的情况下调用它们。例如:

funcs <- list(foo = function(a, b) a + b,
              ## in a list, how can I call `foo` from `bar`?
              bar = function(m) foo(m, m/2))

我正在寻找类似于从当前位置(例如../foo)在目录中向上移动的东西,但是作为函数调用。

某些背景信息:

有一个包含一些预定义的modeling elements。已经有一些新功能的要求需要知道参数值的范围。那些是当前在列表中的函数中编码的。例如,对于偏最小二乘法,参数值的范围可以在1和数据集中预测变量的数量之间:

modelInfo <- list(## other list elements
    grid = function(x, y, len = NULL, search = "grid") {
        if(search == "grid") {
            out <- data.frame(ncomp = seq(1, min(ncol(x) - 1, len), by = 1))
        } else {
            out <- data.frame(ncomp = unique(sample(1:ncol(x), replace = TRUE)))
        } 
        out
    },
    ## more list elements
)

我想添加一个名为bounds的列表元素,它将对可能的值进行编码,并grid引用它们。我可以将bounds函数数据传递给grid,但这会添加新的参数并打破很多向后兼容性。如果代码没有重大更改,我认为没有任何其他解决方案可以从bounds引用grid

2 个答案:

答案 0 :(得分:2)

使用环境代替列表:

env <- new.env()
env$foo <- function(a, b) a + b
env$bar <- function(m) foo(m, m/2)
environment(env$foo) <- environment(env$bar) <- env

env$bar(3)
# 4.5

答案 1 :(得分:2)

foo不在bar的搜索路径上。但是,funcs是:

funcs <- list(foo = function(a, b) a + b,
              bar = function(m) funcs$foo(m, m/2))
funcs$bar(3)
#[1] 4.5

如果你已经有了构造函数,你可以这样做:

constructFuncs <- function() {
  foo <- function(a, b) a + b 
  bar <- function(m) foo(m, m/2)
  list(foo = foo, bar = bar)
}
funcs <- constructFuncs()
funcs$bar(3)  
#[1] 4.5

但是,我建议使用更好的方法。在这种情况下,环境(或者甚至可能是引用类?)似乎比列表更可取。