将函数列表应用于参数列表

Applying a list of functions to a list of arguments

通过将函数列表应用于参数列表来创建列表的 R 惯用方法是什么?

例如,给定一个函数列表和一个参数列表,数量相等(例如,三个),

fncs <- list(f1, f2, f3)
args <- list(x1, x2, x3)

我想获取函数值列表,

fnc_vals <- list(f1(x1), f2(x2), f3(x3))

换句话说,我想将 base-R 函数 mapply 的广义形式应用于列表 fncsargs(将单个函数应用于列表参数)。

这很容易做到:

dapply <- function(args, fncs, ...) {  # "diagonal" apply
    lapply(seq_along(args), function(i) fncs[[i]](args[[i]], ...))
}

fnc_vals <- dapply(args, fncs)

然而,在我看来,这很笨拙,因为它会更自然——如果可能的话,在 R 中,没有扭曲——运行 成对地通过函数和参数来生成所需的函数值列表;在 Python 中,应该是这样的:

fncs = [f1, f2, f3]
args = [x1, x2, x3]
fnc_vals = [f(x) for f, x in zip(fncs, args)]

这个“zippy”结构也可以在 R 中实现吗?

您可以将 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 作为它的第二个参数。

或者既然你写了一个匿名函数,你可以像@akrun 指出的那样使用Map(function(f, x) f(x), fncs, args)