Туннельные переменные данных через env-переменную с оператором "{{" - PullRequest
2 голосов
/ 19 февраля 2020

Следуя примеру из https://www.tidyverse.org/blog/2020/02/glue-strings-and-tidy-eval/

Как передать переменные в эту функцию?

library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 3.6.2
#> Warning: package 'tidyr' was built under R version 3.6.2

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

mean_by(mtcars, by = cyl, var = mpg, prefix = "avg")
#> # A tibble: 3 x 2
#>     cyl avg_mpg
#>   <dbl>   <dbl>
#> 1     4    26.7
#> 2     6    19.7
#> 3     8    15.1

# Variables to pass into function
params <-  setdiff(colnames(mtcars) ,"mpg") 

# How do you pass a variables into this function? 
purrr::map(params, mean_by(mtcars, by = .x, var = mpg, prefix = "avg"))
#> Error: Column `.x` is unknown

Создано в 2020-02-19 представлением пакета (v0.3.0)

Ответы [ 2 ]

4 голосов
/ 19 февраля 2020

Используйте местоимение .data с именем столбца:

purrr::map(params, ~ mean_by(mtcars, by = .data[[.x]], var = mpg, prefix = "avg"))
1 голос
/ 19 февраля 2020

Мы могли бы использовать ensym, поскольку params - это строки. Итак, либо преобразуйте в символ с ensym

library(dplyr)
library(purrr)
library(stringr)
mean_by <- function(data, by, var, prefix = "avg") {

 by <- rlang::ensym(by)
 var <- rlang::ensym(var)
 data %>%
    group_by(!! by) %>%
    summarise(!!str_c(prefix, var, sep="_")  := mean(!!var, na.rm = TRUE))
  }

mean_by(mtcars, by = cyl, var = "mpg", prefix = "avg")
# A tibble: 3 x 2
#    cyl avg_mpg
#  <dbl>   <dbl>
#1     4    26.7
#2     6    19.7
#3     8    15.1


map(params, ~mean_by(mtcars, by = !!.x, var = "mpg", prefix = "avg"))
#[[1]]
# A tibble: 3 x 2
#    cyl avg_mpg
#  <dbl>   <dbl>
#1     4    26.7
#2     6    19.7
#3     8    15.1

#[[2]]
# A tibble: 27 x 2
#    disp avg_mpg
#   <dbl>   <dbl>
# 1  71.1    33.9
# 2  75.7    30.4
# 3  78.7    32.4
# 4  79      27.3
# 5  95.1    30.4
# 6 108      22.8
# ...
...