将省略号参数指定为一个对象

问题描述 投票:0回答:1

我想循环尝试不同的参数组合的函数。 我想在列表中指定参数(即结构化格式)

在以下示例中,我希望输出为:

# 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, ...)

非常感谢任何帮助。

r lapply
1个回答
0
投票

你只需要再一层:

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
© www.soinside.com 2019 - 2024. All rights reserved.