You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:16:06