我想循环尝试不同的参数组合的函数。 我想在列表中指定参数(即结构化格式)
在以下示例中,我希望输出为:
# n=0, m=0: 1, 2, 3, 4
# n=1, m=0: 2, 3, 4, 5
# n=1, m=10: 20, 30, 40, 50
test <- function(x, n = 0, m = 1) {(x + n) * m}
vals <- list(1, 2, 3, 4)
arg_list <- list(args1 = list(),
args1 = list(n = 1),
args2 = list(n = 1, m = 10))
lapply(vals, test, arg_list[[1]])
lapply(vals, test, arg_list[[2]])
lapply(vals, test, arg_list[[3]])
但这会产生错误。
我可以通过执行以下操作来获得我正在寻求的功能,但这似乎不是最优雅的实现。
lapply(vals, FUN = function(x) do.call(test, c(x = x, arg_list[[1]])))
lapply(vals, FUN = function(x) do.call(test, c(x = x, arg_list[[2]])))
lapply(vals, FUN = function(x) do.call(test, c(x = x, arg_list[[3]])))
本质上我问的是在与 lapply() 一起使用时如何将省略号参数作为一个对象传递。
lapply(X, FUN, ...)
非常感谢任何帮助。
你只需要再一层:
lapply(arg_list, \(arg)
lapply(vals, \(x)
do.call(test, c(x = x, arg))
)
)
# $args1
# $args1[[1]]
# [1] 1
#
# $args1[[2]]
# [1] 2
#
# $args1[[3]]
# [1] 3
#
# $args1[[4]]
# [1] 4
#
#
# $args1
# $args1[[1]]
# [1] 2
#
# $args1[[2]]
# [1] 3
#
# $args1[[3]]
# [1] 4
#
# $args1[[4]]
# [1] 5
#
#
# $args2
# $args2[[1]]
# [1] 20
#
# $args2[[2]]
# [1] 30
#
# $args2[[3]]
# [1] 40
#
# $args2[[4]]
# [1] 50