如何捕获函数的参数并按原样在另一个函数中应用它们 context/environment

How do I capture the argument to a function and apply them as is in another context/environment

我很确定我的语言不够精确,但我还不知道正确的术语。这就是我想要实现的目标:

我有一个函数abc2。我想获取用户提供的参数(无需评估或更改参数),以在另一个函数中使用。例如

abc2 <- function(...) {
 # what do I have to do here?
}

adf = data.frame(a = 1:3, b = 1:3)
bdf = data.frame(a = 11:13, b = 11:33)

调用 abc2(a) 与调用

相同
dplyr::select(adf, a)
dplyr::select(bdf, a)

并且调用 abc2("a") 与调用

相同
dplyr::select(adf, "a")
dplyr::select(bdf, "a")

基本上,我想从 abc2 移植 ... 并在不改变用户输入方式的情况下应用它们并在其他地方应用。

欢迎使用 Base R 和 tidyeval 解释!我正在尝试阅读 quoenquo,但我似乎无法理解它。

1) base R...上。可以使用 "a" 或仅使用 a。这里的传递机制只使用base R。dplyr只是为了我们可以使用select.

library(dplyr)

adf = data.frame(a = 1:3, b = 1:3)
bdf = data.frame(a = 11:13, b = 21:23)

abc2 <- function(...) {
  print(select(adf, ...))
  print(select(bdf, ...))
}

# or: abc2(a)
abc2("a")

给予:

  a
1 1
2 2
3 3
   a
1 11
2 12
3 13

2) rlang 这也行,但这次我们使用 rlang 的 enquos 和 !!!使用 tidyeval,所有这些都由 dplyr 拉入。

abc2a <- function(...) {
  dots <- enquos(...)
  print(select(adf, !!!dots))
  print(select(bdf, !!!dots))
}
abc2(a)