【发布时间】:2018-06-09 04:25:45
【问题描述】:
我正在寻找有关将函数列表作为参数传递的最佳编码方式的建议。
我想做的事:
我想将一个函数列表作为参数传递,以将它们应用于特定输入。并根据这些给出输出名称。
一个“可重现”的例子
input = 1:5
要传递的函数是mean、min
预计来电:
foo(input, something_i_ask_help_for)
预期输出:
list(mean = 3, min = 1)
如果不是很清楚,请查看我的两个解决方案以进行说明。
解决方案 1: 将函数作为参数传递
foo <- function(input, funs){
# Initialize output
output = list()
# Compute output
for (fun_name in names(funs)){
# For each function I calculate it and store it in output
output[fun_name] = funs[[fun_name]](input)
}
return(output)
}
foo(1:5, list(mean=mean, min=min))
我不喜欢这种方法的是我们不能通过这样做来调用它:foo(1:5, list(mean, min))。
解决方案 2: 将函数名称作为参数传递并使用 get
foo2 <- function(input, funs){
# Initialize output
output = list()
# Compute output
for (fun in funs){
# For each function I calculate it and store it in output
output[fun] = get(fun)(input)
}
return(output)
}
foo2(1:5, c("mean", "min"))
我不喜欢这种方法的是我们并没有真正将函数对象作为参数传递。
我的问题:
两种方法都可以,但我不太确定该选择哪一种。
你能帮我吗:
- 告诉我哪个最好?
- 每种方法的优点和默认值是什么?
- 还有其他(更好的)方法
如果您需要更多信息,请随时询问。
谢谢!
【问题讨论】:
-
如果你可以不用函数
foo返回一个命名列表,也许你可以从lapply(funs, function(f) f(input))获得一些灵感。
标签: r function parameter-passing