我有一个函数列表,我希望能够在不将它们作为独立对象的情况下调用它们。例如:
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
。
答案 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
但是,我建议使用更好的方法。在这种情况下,环境(或者甚至可能是引用类?)似乎比列表更可取。