Unpacking argument lists for ellipsis in R

后端 未结 3 510
暗喜
暗喜 2020-12-08 04:09

I am confused by the use of the ellipsis (...) in some functions, i.e. how to pass an object containing the arguments as a single argument.

In Python it

相关标签:
3条回答
  • 2020-12-08 04:36

    You can extract information from the ellipsis by calling list(...) inside the function. In this case, the info in the ellipsis is packaged as a list object. For example:

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

    You can achieve the desired behaviour from vectorised functions like file.path with a call to do.call, which is sometimes simpler to use with the wrapper splat (in the plyr package)

    > args <- c('baz', 'foob')
    > library(plyr)
    > splat(file.path)(c('/foo/bar', args))
    [1] "/foo/bar/baz/foob"
    
    0 讨论(0)
  • 2020-12-08 04:37

    The syntax is not as beautiful, but this does the trick:

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

    do.call takes two arguments: a function and a list of arguments to call that function with.

    0 讨论(0)
  • 2020-12-08 04:42

    It took me a while to find it, but the purrr package has an equivalent to plyr::splat: it's called lift_dl.

    The "dl" in the name stands for "dots to list", as it's part of a series of lift_xy functions that can be used to "lift" the domain of a function from one kind of input to another kind, these "kinds" being lists, vectors and "dots".

    Since lift_dl is probably the most useful of those, there is a simple lift alias provided for it.

    To reuse the above example:

    > library(purrr)
    > args <- c('baz', 'foob')
    > lift(file.path)(c('/foo/bar', args))
    [1] "/foo/bar/baz/foob"
    
    0 讨论(0)
提交回复
热议问题