List 解包R中省略号的参数列表

List 解包R中省略号的参数列表,list,r,ellipsis,iterable-unpacking,List,R,Ellipsis,Iterable Unpacking,我对在某些函数中使用省略号(…)感到困惑,即如何将包含参数的对象作为单个参数传递 在Python中,它被称为“解包参数列表”,例如 例如,在R中,函数file.path(…)使用省略号。我希望有这样的行为: > args <- c('baz', 'foob') > file.path('/foo/bar/', args) [1] 'foo/bar/baz/foob' 其中,args的元素不是“解包”的,而是同时评估的。是否存在与Pythons*arg等效的R?您可以通过在函

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

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

例如,在R中,函数
file.path(…)
使用省略号。我希望有这样的行为:

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

其中,
args
的元素不是“解包”的,而是同时评估的。是否存在与Pythons
*arg
等效的R?

您可以通过在函数中调用
列表(…)
从省略号中提取信息。在本例中,省略号中的信息打包为列表对象。例如:

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

[[2]]
[1] "foobar"

语法没有那么漂亮,但这确实起到了作用:

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

do.call
接受两个参数:一个函数和一组用于调用该函数的参数

我花了一段时间才找到它,但是这个包有一个等价物:它被称为

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

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

要重用上述示例,请执行以下操作:

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

关于此技术的扩展讨论:
> args <- c('baz', 'foob')
> library(plyr)
> splat(file.path)(c('/foo/bar', args))
[1] "/foo/bar/baz/foob"
do.call(file.path,as.list(c("/foo/bar",args)))
> library(purrr)
> args <- c('baz', 'foob')
> lift(file.path)(c('/foo/bar', args))
[1] "/foo/bar/baz/foob"