【发布时间】:2011-09-23 17:15:44
【问题描述】:
我一直很难找到有关如何将列表传递给 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') 不提供有关将列表传递给函数的信息。
更新
为了澄清,我了解如何将列表用作单个参数,但我感到困惑,因为我的印象是函数的属性是多个参数可以作为列表传递。看来这种印象是不正确的。相反,许多函数是专门为处理列表而编写的,如下面的 cmets 和答案中所述。
【问题讨论】:
-
您正在将一个参数传递给您的函数,它需要 2。正确的调用是:foo(a=list(1), b=list(2))。如果您想将单个列表传递给您的函数,那么您必须将其声明为 function(a),然后以与您相同的方式调用它。你的函数逻辑也关闭了,因为你不能以这种方式添加非数字参数,你必须在你的函数体中索引你的列表来实现你想要的(在这里猜测)即 a[[1]] + b [[1]]。
-
我没有研究过,但我猜
plot有一个处理列表的方法。要对foo执行类似操作,您需要将其设为通用并编写适当的方法。 -
@Joshua,感谢您的澄清。我的印象是,一个列表可以在没有特殊处理的情况下通过。
-
plot(list(x=1,y=1))调用plot.default,它使用xy.coords。xy.coords的源有一个 if/else 分支来处理多种类型的x参数(ts、matrix、data.frame、formula、complex、list)。所以它不是通用的 using 方法。类似的解决方案是定义foo(a, b=NULL)并在b为空时有一个if/else 分支来处理a的多个类。