代码之家  ›  专栏  ›  技术社区  ›  Shantanu Ben Bolker

使用dplyr::filter的简洁方式是什么?

  •  5
  • Shantanu Ben Bolker  · 技术社区  · 8 年前

    使用调用下面的函数 foo(c("b"))

    df %>% filter(!!x > (!!x)) ?

    我已经包括了一个使用 mutate 以整洁的风格与 filter .

    foo <- function(variables) {
    
      x <- rlang::sym(variables[[1]])
    
      print(x)
      #> b
    
      print(typeof(x))
      #> [1] "symbol"
    
      df <- data_frame(a = 1, b = 2)
    
      print(df %>% mutate(!!x := 100 + !!x))
    
      #> # A tibble: 1 x 2
      #>         a     b
      #>       <dbl> <dbl>
      #>   1     1   102  
    
      print(df %>% filter(!!x  > (!!x)))
    
      #> Error in !x : invalid argument type
    
      print(df %>% filter(magrittr::is_greater_than(!!x, !!x)))
    
      #> # A tibble: 0 x 2
      #> # ... with 2 variables: a <dbl>, b <dbl>
    
    }
    
    4 回复  |  直到 8 年前
        1
  •  3
  •   Kevin Arseneau    8 年前

    print(df %>% filter((!!x) > !!x))
    
    #> # A tibble: 0 x 2
    #> # ... with 2 variables: a <dbl>, b <dbl>
    
        2
  •  2
  •   Lionel Henry    7 年前

    编辑 :所有这些都不再适用。优先级树被重新组织,以便 !!x + !!y


    这个 !

    !! x > 3
    

    (!! x > 3)
    

    因此,您必须用显式括号帮助R计算出正确的优先级:

    (!! x) > 3
    

    (!! x) + (!! y) + z
    

    然而,根据通常神秘的优先规则,这会有所不同,因此我建议在涉及运算符时始终用括号括起来:

    (!! x ) + (!! y) + (!! z)
    
        3
  •  0
  •   CPak    8 年前

    您可以使用 filter_at

    oof <- function(variables) {
      x <- rlang::sym(variables[[1]])
      df <- data.frame(a = 1, b = 2)
      print(df %>% filter_at(vars(!!x), any_vars(. == !!x)))
      print(df %>% filter(magrittr::equals(!!x, !!x)))
    }
    

    magrittr::equals

    oof(c("b"))
    
    #   a b
    # 1 1 2
    #   a b
    # 1 1 2
    
        4
  •  0
  •   guna    8 年前

    data%>%
        filter(!!quo((!!as.name (field1)) > (!!myVal)))