【问题标题】:How can I use NSE and filter an expression using ... (ellipsis)?如何使用 NSE 并使用 ...(省略号)过滤表达式?
【发布时间】:2020-01-31 23:10:51
【问题描述】:

如何利用魔术点 (...) / 省略号来过滤任意列?

df = tibble::tibble(col1 = c('a', 'b', 'c'), col2 = c(1,3,4))

my_func = function(x, ...){
  df %>%
    dplyr::filter(... == x)
}

my_func('a', col1)


# Should return:
# A tibble: 1 x 2
  col1   col2
  <chr> <dbl>
1 a         1

【问题讨论】:

  • 您通常希望将数据框作为第一个参数传递给dplyr-type 函数。尝试将参数切换为dataframe, string, ...。此外,... 意味着可能有多个列 - 当您有多个列进入时,您希望如何进行比较?
  • 确实如此,这是遗留代码库中的一个特定用例。我必须削减它,这基本上是我要重构的垫脚石。它肯定会转向使用变量名而不是...

标签: r dplyr rlang


【解决方案1】:

我们可以转换为 quosure (quo) 并评估 (!!)。在这里,我们假设只有一列传入filter

my_func <- function(x, ...){
   df %>%
      dplyr::filter(!! quo(...) == x)
  }



my_func('a', col1)
# A tibble: 1 x 2
#  col1   col2
#  <chr> <dbl>
#1 a         1

如果有多个列,那么使用filter_at可能会更好


如果我们可以作为参数传递而不是...,那么使用{{}} 可能会更好

my_func <- function(x, coln) {
        df %>%
              filter({{coln}} == x)
    }
my_func('a', col1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2011-03-09
    • 2017-01-21
    相关资源
    最近更新 更多