如何在R中使用do.call()向双参数函数传入两个列表的参数?
解决do.call()批量调用函数的问题
你想用do.call()批量调用函数,从表格取参数对生成图表,但示例代码报错。先看你的问题代码和错误:
问题代码
fun <- function(x, y) { z = x + y assign(gsub(" ","_",paste("sum of", x, "and", y)), z, env=.GlobalEnv) } list_x = as.list(c(1, 2, 3)) list_y = as.list(c(4, 3, 2)) do.call(fun, c(list_x, list_y)) sum_of_1_and_4 sum_of_2_and_3 sum_of_3_and_2
错误信息
Error in (function (x, y) : unused arguments (3, 4, 3, 2)
错误原因
do.call()的作用是单次调用函数,第二个参数需要是该函数单次调用的参数列表。你把list_x和list_y合并后,相当于给fun传递了6个参数(1,2,3,4,3,2),但fun只接受x和y两个参数,所以触发“未使用参数”的错误。
正确解决方法
要批量调用函数处理每组参数对,需要用迭代类函数,而非单次的do.call(),以下是几种方案:
方案1:用mapply直接配对参数
mapply可以自动把多个参数列表的对应元素配对,逐个调用函数:
fun <- function(x, y) { z = x + y assign(gsub(" ","_",paste("sum of", x, "and", y)), z, env=.GlobalEnv) } list_x = as.list(c(1, 2, 3)) list_y = as.list(c(4, 3, 2)) # 按位置配对每组x和y,逐个调用fun mapply(fun, list_x, list_y)
运行后就能得到预期的三个全局变量:sum_of_1_and_4=5、sum_of_2_and_3=5、sum_of_3_and_2=5。
方案2:结合do.call和循环(适合理解底层逻辑)
如果一定要用do.call(),需要先把每组参数打包成单独的列表,再循环调用:
fun <- function(x, y) { z = x + y assign(gsub(" ","_",paste("sum of", x, "and", y)), z, env=.GlobalEnv) } list_x = as.list(c(1, 2, 3)) list_y = as.list(c(4, 3, 2)) # 把每组x和y打包成参数列表的集合 params_list <- Map(function(x_val, y_val) list(x = x_val, y = y_val), list_x, list_y) # 循环用do.call执行每组参数 lapply(params_list, function(params) do.call(fun, params))
方案3:从表格取参数的最优写法(贴合你的实际需求)
如果参数来自表格(比如data.frame),用purrr包的pmap更简洁:
library(purrr) fun <- function(x, y) { z = x + y assign(gsub(" ","_",paste("sum of", x, "and", y)), z, env=.GlobalEnv) } # 模拟你的参数表格 params_df <- data.frame(x = c(1, 2, 3), y = c(4, 3, 2)) # 按行调用函数,自动匹配列名和参数名 pmap(params_df, fun)
内容的提问来源于stack exchange,提问作者Charles Lehnen
相关产品推荐
相关产品推荐

