2

As per this article, a recent version of rlang and glue allows to combine tunnelling {{ myobj }} into a glue string:

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

But if I want to combine on the other side of the equation, I cannot do this:

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 }

What would be the best way to get around this problem?

Erik A
  • 31,639
  • 12
  • 42
  • 67
Phil
  • 7,287
  • 3
  • 36
  • 66

2 Answers2

1

Perhaps, we can use ensym or enquo before passing into 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
akrun
  • 874,273
  • 37
  • 540
  • 662
0

You could use deparse and 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
Ronak Shah
  • 377,200
  • 20
  • 156
  • 213