代码之家  ›  专栏  ›  技术社区  ›  guna

示例中的问题:使用dplyr编程

  •  4
  • guna  · 技术社区  · 8 年前

    参考: http://dplyr.tidyverse.org/articles/programming.html

    此代码工作正常:

    df <- tibble(
      g1 = c(1, 1, 2, 2, 2),
      g2 = c(1, 2, 1, 2, 1),
      a = sample(5), 
      b = sample(5)
    )
    
    
    my_summarise <- function(df, group_by) {
      group_by <- enquo(group_by)
      print(group_by)
    
      df %>%
        group_by(!!group_by) %>%
        summarise(a = mean(a))
    }
    
    my_summarise(df, g1)
    

    然而,如果我们将此函数封装在另一个函数中并进行调用,它将无法工作。是不是因为这个名字只通过了一个级别?

    wrapped_my_Summarize <- function(wdf, w_group_by){
      my_summarise(wdf, w_group_by)
    }
    
    wrapped_my_Summarize(df, g1)
    

    总的来说,我觉得上面的例子很冒险

    1 回复  |  直到 8 年前
        1
  •  8
  •   akrun    8 年前

    使用符号将其转换为quosure enquo 然后计算函数参数( !! )共个 my_summarise

    wrapped_my_Summarize <- function(wdf, w_group_by){
      w_group_by <- enquo(w_group_by) 
      my_summarise(wdf, !! w_group_by)
    }
    
    wrapped_my_Summarize(df, g1)
    # A tibble: 2 x 2
    #     g1     a
    #   <dbl> <dbl>
    #1  1.00  2.00
    #2  2.00  3.67
    
    identical(wrapped_my_Summarize(df, g1), my_summarise(df, g1))
    #[1] TRUE