【问题标题】:How to pass a list to a function in R?如何将列表传递给R中的函数?
【发布时间】: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.coordsxy.coords 的源有一个 if/else 分支来处理多种类型的 x 参数(tsmatrixdata.frameformulacomplexlist)。所以它不是通用的 using 方法。类似的解决方案是定义foo(a, b=NULL) 并在b 为空时有一个if/else 分支来处理a 的多个类。

标签: function r


【解决方案1】:

使用 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))

【讨论】:

    【解决方案2】:

    您的函数有两个参数,但您只传递了一个,因此出现错误。

    你可以像这样修改你的代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-04
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多