我对在某些函数中使用省略号(...
)感到困惑,即如何将包含参数的对象作为单个参数传递。
在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
?
答案 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.path
从do.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"