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

时间:2016-05-20 10:21:39

标签: r mapply

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

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

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)

然而,在我看来,这是笨拙的,因为如果可能的话,在没有扭曲的情况下更自然 - 通过函数和参数成对运行以产生所需的函数值列表;在 Python 中,这将是这样的:

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

这个“zippy”结构能否在R中实现?

1 个答案:

答案 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指出。