glue и rlang: как туннелировать переменные данных внутри связующей строки? - PullRequest
2 голосов
/ 07 августа 2020

Согласно этой статье , последняя версия rlang и glue позволяет объединить туннелирование {{ 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 }

Как лучше всего решить эту проблему?

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Возможно, мы можем использовать ensym или enquo перед переходом в 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
0 голосов
/ 07 августа 2020

Вы можете использовать deparse и 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
...