有人解决了我的问题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))
这样做有什么好办法?
答案 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
请记住,这只适用于命名列表,并且需要针对未命名列表进行调整。而且最后一行是可选的,我添加了它,尽管你想要的结果是一个未命名的列表。