2

根据本文,最新版本的rlangandglue允许将隧道组合{{ 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 }

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

4

2 回答 2

1

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

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
于 2020-08-06T21:41:05.017 回答
0

你可以使用deparseand substitute

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
于 2020-08-07T02:02:13.440 回答