将函数列表应用于参数列表
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
的广义形式应用于列表 fncs
和 args
(将单个函数应用于列表参数)。
这很容易做到:
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)
。
通过将函数列表应用于参数列表来创建列表的 R 惯用方法是什么?
例如,给定一个函数列表和一个参数列表,数量相等(例如,三个),
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)
然而,在我看来,这很笨拙,因为它会更自然——如果可能的话,在 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)
。