在R中解压缩省略号的参数列表

时间:2010-08-05 11:09:13

标签: list r ellipsis iterable-unpacking

我对在某些函数中使用省略号(...)感到困惑,即如何将包含参数的对象作为单个参数传递。

在Python中,它被称为“解包参数列表”,例如

>>> range(3, 6)             # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)            # call with arguments unpacked from a list
[3, 4, 5]

例如,在R中,你有一个使用省略号的函数file.path(...)。我想有这种行为:

> args <- c('baz', 'foob') 
> file.path('/foo/bar/', args)
[1] 'foo/bar/baz/foob'

相反,我得到了

[1] 'foo/bar/baz' 'foo/bar/foob'

其中args的元素未被“解包”并同时进行评估。是否有R等价于Pythons *arg

3 个答案:

答案 0 :(得分:36)

语法不是那么漂亮,但这就是诀窍:

do.call(file.path,as.list(c("/foo/bar",args)))

do.call有两个参数:一个函数和一个用于调用该函数的参数列表。

答案 1 :(得分:19)

您可以通过调用函数内的list(...)从省略号中提取信息。在这种情况下,省略号中的信息将打包为列表对象。例如:

> foo <- function(x,...){
+   print(list(...))
+ }
> foo(1:10,bar = 'bar','foobar')
$bar
[1] "bar"

[[2]]
[1] "foobar"

您可以通过调用file.pathdo.call等矢量化函数实现所需的行为,这有时可以更轻松地与包装器splat一起使用(在plyr中包)

> args <- c('baz', 'foob')
> library(plyr)
> splat(file.path)(c('/foo/bar', args))
[1] "/foo/bar/baz/foob"

答案 2 :(得分:0)

我花了一段时间才找到它,但是purrr软件包与plyr::splat等效:它称为lift_dl

名称中的“ dl”代表“要列出的点”,因为它是一系列lift_xy函数的一部分,这些函数可用于将函数的域从一种输入转换为另一种,这些“种类”是列表,向量和“点”。

由于lift_dl可能是其中最有用的,因此为其提供了一个简单的lift别名。

要重用以上示例:

> library(purrr)
> args <- c('baz', 'foob')
> lift(file.path)(c('/foo/bar', args))
[1] "/foo/bar/baz/foob"