怎么把list转换成省略号?

时间:2018-10-31 14:56:27

标签: r

这个答案How to convert a list() to an ellipsis in R?不令人满意,因为它不适用于我的问题:

给出:

foo <- function(...) {
  print(length(list(...)))
}

何时:

foo2 <- function(listArg) {
  # HERE convert from list to ...
  foo(listArg)
}

那么这些都应该相等:

foo() == foo2(list())
foo(1, 2) == foo2(list(1, 2))
foo(1, 2, 3) === foo2(list(1, 2, 3))

foo2“#在这里将列表中的内容转换为...”中的内容

2 个答案:

答案 0 :(得分:2)

也许这可以回答您的问题:

foo <- function(...) length(list(...))
foo2 <- function(listArg) do.call(foo, listArg)

foo() == foo2(list())
# [1] TRUE
foo(1, 2) == foo2(list(1, 2))
# [1] TRUE
foo(1, 2, 3) == foo2(list(1, 2, 3))
# [1] TRUE

通过这种方式,我们不会将列表转换为省略号,而是通过在调用中进行转换来不同地调用foo

答案 1 :(得分:1)

一定要使用do.call()

我们可以使您的代码适用于:

list2dots <- function(x) {
  make_dots <- function(...) environment()$...
  do.call(make_dots, as.list(x))
}

foo <- function(...) {
  length(list(...))
}

foo2 <- function(listArg) {
  `...` <- list2dots(listArg)
  foo(...)
}

foo() == foo2(list())
#> [1] TRUE
foo(1, 2) == foo2(list(1, 2))
#> [1] TRUE
foo(1, 2, 3) == foo2(list(1, 2, 3))
#> [1] TRUE