R:按名称应用参数列表中的函数列表

时间:2014-08-19 21:30:32

标签: r

有人解决了我的问题applying list of functions on list of argument by order,现在我有另一个类似的问题,如何在列表中应用函数我的名字?例如,如果我有:

f1 <- function(x) {x}
f2 <- function(x) {2*x}
f3 <- function(x) {3*x}
fun_list <- list(good=f1, better=f2, best=f3)
arg_list <- list(better=1, best=2, good=3)

我想获取在各自命名参数上调用的函数列表,即我想要:

some_magic_fun(fun_list, arg_list) == list(f1(3), f2(1), f3(2)) 

这样做有什么好办法?

3 个答案:

答案 0 :(得分:10)

据我所知,你想从列表中选择函数和参数,但不一定按顺序排列,但它们有一组共同的名称:

 lapply(names(fun_list), function(n) fun_list[[n]](arg_list[[n]]) )
#----------
[[1]]
[1] 3

[[2]]
[1] 2

[[3]]
[1] 6

如果您想要结果,我们并不完全清楚,但这就是我的假设。如果你真的想要未评估的表达,你需要澄清。

答案 1 :(得分:7)

1)mapply 这不会给出一个列表(下面有2个),但它可能是你真正想要的:

> mapply(do.call, fun_list, lapply(arg_list[names(fun_list)], list))
good better   best 
   3      2      6 

2)地图这会给出一个列表作为要求的结果。它与(1)相同,但mapply替换为Map

> Map(do.call, fun_list, lapply(arg_list[names(fun_list)], list))
$good
[1] 3

$better
[1] 2

$best
[1] 6

根据评论修改

答案 2 :(得分:5)

这可能是一个神奇的功能:

> some_magic_fun <- function(funList, argList){
      m <- match(nmf <- names(funList), names(argList))
      l <- lapply(seq(m), function(i) funList[[i]](m[i]))
      setNames(l, nmf)
  }
> some_magic_fun(fun_list, arg_list)
# $good
# [1] 3
#
# $better
# [1] 2
#
# $best
# [1] 6

请记住,这只适用于命名列表,并且需要针对未命名列表进行调整。而且最后一行是可选的,我添加了它,尽管你想要的结果是一个未命名的列表。