嵌套函数调用中的 NSE

Lim*_*mey 6 r nse tidyeval

我想使用实用程序函数来检查给定的列中是否存在给定的data.frame. 我在 tidyverse 中穿梭。到目前为止我想出的最好的是

library(magrittr)

columnExists <- function(data, col) {
  tryCatch({
    rlang::as_label(rlang::enquo(col)) %in% names(data)
    },
    error=function(e) FALSE
  )
}
Run Code Online (Sandbox Code Playgroud)

这适用于全球环境

> mtcars %>% columnExists(mpg)
[1] TRUE
> mtcars %>% columnExists(bad)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

但当从另一个函数中调用时则不然,这是我的实际用例

outerFunction <- function(d, col) {
  d %>% columnExists((col))
}
> mtcars %>% outerFunction(mpg)  # Expected TRUE
[1] FALSE
> mtcars %>% outerFunction(bad) # Expected FALSE
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?是否有可能有一个函数在全局环境中以及嵌套在另一个函数中时也能正常工作?

我发现了几篇与检查给定列是否存在相关的帖子,但它们似乎都假设列名将作为字符串传递,或者检查存在的调用不是嵌套的(或两者兼而有之)。这里情况不同。

MrF*_*ick 6

您想要传递outerFunction 中的原始符号。使用

outerFunction <- function(d, col) {
  d %>% columnExists( {{col}} )
}
Run Code Online (Sandbox Code Playgroud)

“拥抱”语法将阻止早期评估。

  • @TarJae。更像是“enquo”只会看到“col”,而不是传递给“col”的值。所以我在这里并没有真正正确地使用“评估”,但我不确定我可以称之为什么。 (2认同)