【问题标题】:Unpacking argument lists for ellipsis in R在 R 中为省略号解包参数列表
【发布时间】:2011-03-25 18:03:26
【问题描述】:

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

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

【问题讨论】:

    标签: list r ellipsis iterable-unpacking


    【解决方案1】:

    语法没有那么优美,但这可以解决问题:

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

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

    【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我花了一段时间才找到它,但 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"
      

      【讨论】:

      • 这太棒了!
      猜你喜欢
      • 2011-03-09
      • 2013-06-27
      • 1970-01-01
      • 2018-09-02
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      相关资源
      最近更新 更多