我对某些函数中使用省略号(...
)感到困惑,即如何将包含参数的对象作为单个参数传递。
在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等价于Python *arg
?
3条答案
按热度按时间svujldwt1#
语法不是那么漂亮,但这确实是个窍门:
do.call
有两个参数:一个函数和调用该函数的参数列表。rbpvctlc2#
你可以通过在函数内部调用
list(...)
从省略号中提取信息。在这种情况下,省略号中的信息被打包为列表对象。例如:您可以通过调用
do.call
来实现像file.path
这样的向量化函数的所需行为,这有时与 Package 器splat
(在plyr
包中)一起使用更简单。8iwquhpp3#
我花了一段时间才找到它,但是
purrr
包有一个等价于plyr::splat
的包:叫做lift_dl
名称中的“dl”代表“dots to list”,因为它是一系列
lift_xy
函数的一部分,可用于将函数的域从一种输入“提升”到另一种输入,这些“种类”是列表,向量和“点”。由于
lift_dl
可能是其中最有用的,因此为它提供了一个简单的lift
别名。要重复使用上面的示例:
更新
从purrr 1.0.0开始,
lift_*
系列函数被弃用。接下来,应该使用
rlang::inject
来通过!!!
operator实现拼接: