【问题标题】:glue and rlang: how to tunnel data-variables within a glue string?胶水和rlang:如何在胶水字符串中隧道数据变量?
【发布时间】:2020-11-27 05:07:39
【问题描述】:

根据this 文章,rlangglue 的最新版本允许将隧道{{ myobj }} 组合成glue 字符串:

library(dplyr)
library(rlang)
library(glue)

mean_by <- function(data, by, var, prefix = "avg") {
  data %>%
    group_by({{ by }}) %>%
    summarise("{prefix}_{{ var }}" := mean({{ var }}, na.rm = TRUE))
}

iris %>% mean_by(Species, Sepal.Width)
#> # A tibble: 3 x 2
#>   Species    avg_Sepal.Width
#>   <fct>                <dbl>
#> 1 setosa                3.43
#> 2 versicolor            2.77
#> 3 virginica             2.97

但如果我想在等式的另一边合并,我不能这样做:

analyze_by <- function(data, by, var, prefix = "avg") {
  data %>%
    group_by({{ by }}) %>%
    summarise(analysis = glue("{ prefix } by {{ var }}"))
}

iris %>% analyze_by(Species, Sepal.Width)

#> # A tibble: 3 x 2
#>   Species    analysis      
#>   <fct>      <glue>        
#> 1 setosa     avg by { var }
#> 2 versicolor avg by { var }
#> 3 virginica  avg by { var }

解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: r rlang r-glue


    【解决方案1】:

    您可以使用deparsesubstitute

    library(dplyr)
    library(rlang)
    
    analyze_by <- function(data, by, var, prefix = "avg") {
    
        var_char <- deparse(substitute(var))
        data %>%
           group_by({{ by }}) %>%
           summarise(analysis = glue::glue("{ prefix } by {var_char}"))
    }
    
    iris %>% analyze_by(Species, Sepal.Width)
    
    # A tibble: 3 x 2
    #  Species    analysis          
    #  <fct>      <glue>            
    #1 setosa     avg by Sepal.Width
    #2 versicolor avg by Sepal.Width
    #3 virginica  avg by Sepal.Width
    

    【讨论】:

      【解决方案2】:

      也许,我们可以在传入glue之前使用ensymenquo

      analyze_by <- function(data, by, var, prefix = "avg") {
       
         var <- rlang::ensym(var)
        
         data %>%
           dplyr::group_by({{ by }}) %>%
           dplyr::summarise(analysis =  glue::glue("{ prefix } by {var}"))
       }
      
      iris %>% 
            analyze_by(Species, Sepal.Width)
      # A tibble: 3 x 2
      #  Species    analysis          
      #  <fct>      <glue>            
      #1 setosa     avg by Sepal.Width
      #2 versicolor avg by Sepal.Width
      #3 virginica  avg by Sepal.Width
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-04
        • 2022-01-23
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        • 2020-12-23
        • 2018-02-13
        • 2018-09-26
        相关资源
        最近更新 更多