Ссылочная туннельная переменная в цепочке "%>%" - PullRequest
2 голосов
/ 20 февраля 2020

В продолжение моего предыдущего вопроса - как вы можете ссылаться на вновь созданный столбец позже в анализе? Как вы можете ссылаться на .data[["cyl"]] и переименовывать заголовок как cyl?

Туннельные переменные данных через переменную env с оператором "{{"

library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 3.6.2
#> Warning: package 'tidyr' was built under R version 3.6.2
# Variables to pass into function
params <-  setdiff(colnames(mtcars) ,"mpg") %>% head(3)

graph_by <- function(data, by, var, prefix = "avg") {
  data %>%
    group_by({{ by }}) %>%
    summarise(mean_value := mean({{ var }}, na.rm = TRUE)) %>%
    ggplot(aes(mean_value, {{ by }})) +
    geom_line() +
    geom_point() 
}

graph_by(mtcars, by = cyl, var = mpg)


purrr::map(params, ~ graph_by(mtcars, by = .data[[.x]], var = mpg))
#> [[1]]

#> 
#> [[2]]

#> 
#> [[3]]


## Goal would be to refer to the created variable later in the analysis

# graph_by <- function(data, by, var, prefix = "avg") {
#   data %>%
#     group_by({{ by }}) %>%
#     summarise("{prefix}_{{ var }}" := mean({{ var }}, na.rm = TRUE)) %>%
#     ggplot(aes(.data[[.x]], {{ by }})) +
#     geom_line() +
#     geom_point() +
#     labs(x = "{{ by }}")
# }

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

1 Ответ

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

Эта версия будет работать

graph_by <- function(data, by, var, prefix = "avg") {
  by <- rlang::ensym(by)  
  data %>%
    group_by({{ by }}) %>%
    summarise(mean_value := mean({{ var }}, na.rm = TRUE)) %>%
    ggplot(aes(mean_value, {{by}})) +
    geom_line() +
    geom_point() 
}

purrr::map(params, ~ graph_by(mtcars, by = !!.x, var = mpg))

Обратите внимание, что мы выполняем расширение в вызове map с !!, а затем явно используем ensym, чтобы оно принимало как буквенные значения символов, так и символы без кавычек. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...