51

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

在 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没有“解包”并同时进行评估。是否有与 Pythons 等效的 R *arg

4

3 回答 3

44

语法不是那么漂亮,但这可以解决问题:

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

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

于 2010-08-05T11:26:29.737 回答
24

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

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

[[2]]
[1] "foobar"

您可以从矢量化函数中实现所需的行为,例如file.path调用do.call,这有时更容易与包装器一起使用splat(在plyr包中)

> args <- c('baz', 'foob')
> library(plyr)
> splat(file.path)(c('/foo/bar', args))
[1] "/foo/bar/baz/foob"
于 2010-08-05T11:19:52.157 回答
7

我花了一段时间才找到它,但这个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"
于 2018-10-08T10:00:11.237 回答