通过将一系列函数应用于参数列表来创建列表的R-idiomatic方法是什么?
例如,给定一个函数列表和一个列表参数,数量相等(比方说,三个),
fncs <- list(f1, f2, f3)
args <- list(x1, x2, x3)
我想获取函数值列表
fnc_vals <- list(f1(x1), f2(x2), f3(x3))
换句话说,我想将base-R函数mapply
的通用形式应用于列表fncs
和args
(它将单个函数应用于参数列表)。
这很容易做到:
dapply <- function(args, fncs, ...) { # "diagonal" apply
lapply(seq_along(args), function(i) fncs[[i]](args[[i]], ...))
}
fnc_vals <- dapply(args, fncs)
然而,在我看来,这是笨拙的,因为如果可能的话,在没有扭曲的情况下更自然 - 通过函数和参数成对运行以产生所需的函数值列表;在 Python 中,这将是这样的:
fncs = [f1, f2, f3]
args = [x1, x2, x3]
fnc_vals = [f(x) for f, x in zip(fncs, args)]
这个“zippy”结构能否在R中实现?
答案 0 :(得分:3)
您可以Map
使用mapply
(具有不同默认值的do.call
):
fncs <- list(mean, median, sd)
args <- list(1:5, 11:13, c(1,1,1,2))
Map(function(f, x) do.call(f, list(x)), fncs, args)
#[[1]]
#[1] 3
#
#[[2]]
#[1] 12
#
#[[3]]
#[1] 0.5
匿名函数是必要的,因为do.call
第二个参数需要list
。
或者既然你编写了一个匿名函数,你可以使用Map(function(f, x) f(x), fncs, args)
作为@akrun指出。