作为一组函数的输入的quosures列表

时间:2017-09-06 11:31:38

标签: r dplyr future rlang

这个问题涉及“用dplyr编程”

我想切片函数的...参数,并使用每个元素作为相应函数的参数。

foo <- function(...){
<some code>
}

应该以这种形式评估foo(x, y, z)

list(bar(~x), bar(~y), bar(~z))

以便x, y, z继续引用,直到他们在bar进行评估。

我试过了:

foo <- function(...){
  arguments <- quos(...)
  out <- map(arguments, ~bar(UQ(.)))
  out
}

我有两个意图:

  1. 更好地了解tidyeval / rlang的工作原理以及何时使用它。
  2. future::futureOf()变成一个能让我一次获得多个期货的函数。
  3. 这种方法可能过于复杂,因为我还没有完全理解tidyeval的基本概念。

1 个答案:

答案 0 :(得分:2)

你真的不需要任何包。可以使用match.call

foo <- function(..., envir = parent.frame()) {
   cl <- match.call()
   cl$envir <- NULL
   cl[[1L]] <- as.name("bar")
   lapply(seq_along(cl)[-1], function(i) eval(cl[c(1L, i)], envir))
}

# test    
bar <- function(...) match.call()
foo(x = 1, y = 2, z = 3)

,并提供:

[[1]]
bar(x = 1)

[[2]]
bar(y = 2)

[[3]]
bar(z = 3)

另一项测试

bar <- function(...) ..1^2
foo(x = 1, y = 2, z = 3)

,并提供:

[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 9