如何在R中将一个列表传递给函数?

22
我一直难以找到有关如何在R中将列表传递给函数的信息。
我之前使用过这种方法,例如:
plot(list(x=1,y=1))

但是以下示例给我报错:

foo <- function(a, b) c <- a + b
foo(list(a=1,b=1))

Error in foo(list(a = 1, b = 1)) : 
   argument "b" is missing, with no default

此外,?function不起作用,help('function')也没有提供关于如何将列表传递给函数的信息。

更新

澄清一下,我知道如何将列表用作单个参数,但是我感到困惑的原因是我曾经认为函数的一个特性是可以将多个参数作为列表传递。看来这种印象是错误的。相反,许多函数是专门编写处理列表的,如下面的评论和答案所述。


您正在向期望2个参数的函数传递单个参数。正确的调用方式应该是:foo(a=list(1), b=list(2))。如果您想要将单个列表传递给函数,则必须将其声明为function(a),然后以相同的方式调用它。您的函数逻辑也有误,因为您无法以这种方式添加非数字参数,并且您将不得不在函数体内索引您的列表以实现您想要的效果(猜测)即a[[1]] + b[[1]]。 - diliop
1
我还没有深入研究,但我猜plot有一个处理列表的方法。如果要使用foo进行类似的操作,你需要将其泛化并编写相应的方法。 - Joshua Ulrich
@Joshua,感谢您的澄清。我原本以为可以无需特殊处理地传递列表。 - David LeBauer
plot(list(x=1,y=1)) 调用 plot.default,该函数使用 xy.coordsxy.coords 的源代码有一个 if/else 分支来处理多种类型的 x 参数(tsmatrixdata.frameformulacomplexlist)。因此它不是一个通用的函数。类似的解决方案是定义 foo(a, b=NULL) 并在 b 为 null 时有一个 if/else 分支来处理 a 的多个类。 - Joshua Ulrich
2个回答

43

使用 do.call

foo <- function(a, b)  a + b

do.call(foo, list(a=1,b=1))

或者你可以这样做

foo <- function(l) l$a + l$b

foo(list(a=1,b=1))

7
你的函数有两个参数,但你只传递了一个参数,因此出现了错误。
你可以像这样修改你的代码:
foo <- function(a) c <- a[[1]] + a[[2]]
foo(list(a=1,b=1))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接