如何在lapply()中将省略号参数作为单个对象传入?
解决lapply中传入整组参数列表的优雅写法
当你需要循环调用函数并传入预定义的多组参数列表时,直接将参数列表元素传给lapply的目标函数会因为参数不匹配报错——因为lapply会把列表元素当作单个位置参数传入,而不是拆分成目标函数的多个参数。
示例场景
先定义测试函数和参数列表:
# 测试函数:需要两个参数a和b test <- function(a, b) { a * b + 1 } # 多组参数的列表,每个元素是一组对应test的参数 arg_list <- list( list(a = 2, b = 3), list(a = 5, b = 10), list(a = 0, b = 7) )
替代嵌套do.call的优雅写法
不用写嵌套的匿名函数,直接把do.call作为lapply的目标函数,同时指定what参数为你的测试函数test:
lapply(arg_list, do.call, what = test)
这个写法的原理是:do.call的第一个参数what指定要调用的函数,第二个参数args接收参数列表;lapply会把arg_list的每个元素自动传给do.call的args参数,从而实现自动拆分参数调用test。
运行结果为:
[[1]] [1] 7 [[2]] [1] 51 [[3]] [1] 1
为什么直接传会报错
如果尝试直接写lapply(arg_list, test),lapply会把arg_list里的每个子列表当作test的第一个参数a传入,而b参数缺失,因此触发参数不匹配的错误。
内容的提问来源于stack exchange,提问作者billcam
相关产品推荐
相关产品推荐

