Как я могу использовать аргумент в функции R как текст и как выражение? - PullRequest
0 голосов
/ 04 августа 2020

Вот мой пример функции. В качестве взлома я дважды передаю имя столбца: один раз как переменную и еще раз как имя переменной. Я хотел бы просто передать его один раз, без кавычек.

split_by_quartile <- function(some_tibble, col_name_fn, col_name_text){
  # get the upper quartile of the value
      this_threshold <- some_tibble %>% summarize(this_q = quantile({{col_name_fn}}, 0.75)) %>% pull(this_q) %>% unique
  # filter using that value and create a label
        some_tibble_upper_bit <- some_tibble %>% 
      filter({{col_name_fn}} > this_threshold) %>% # filter using that value
      mutate(set = paste0(col_name_text, ">", round(this_threshold, 1), ", n=", label_comma()(n()))) 
}

и вот как я использую эту функцию и вывод

figure1_data <- bind_rows(
split_by_quartile(as_tibble(mtcars), col_name = disp, col_name_text="disp"),
split_by_quartile(as_tibble(mtcars), col_name = hp, col_name_text="hp")
)

ggplot(figure1_data, aes(y=set, x=mpg)) +
    geom_boxplot() 

Это наиболее многообещающая R-страница: https://dplyr.tidyverse.org/articles/programming.html. Он показывает, как использовать синтаксис клея в сочетании с: =, чтобы использовать имена переменных в имени выходной переменной, но не в выходном значении.

Спасибо за любую помощь!

1 Ответ

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

Если вам нужен символ, вам нужно явно захватить, а не передавать его с помощью {{}}. Попробуйте это

split_by_quartile <- function(some_tibble, col_name_fn){
  col_name_sym <- rlang::ensym(col_name_fn)
  # get the upper quartile of the value
  this_threshold <- some_tibble %>% summarize(this_q = quantile(!!col_name_sym, 0.75)) %>% pull(this_q) %>% unique
  # filter using that value and create a label
  some_tibble_upper_bit <- some_tibble %>% 
    filter(!!col_name_sym > this_threshold) %>% # filter using that value
    mutate(set = paste0(rlang::as_label(col_name_sym), ">", round(this_threshold, 1), ", n=", scales::label_comma()(n()))) 
}

Обратите внимание, как мы фиксируем здесь символ с помощью rlang::ensym. Затем мы можем расширить его с помощью !! или превратить в строку с rlang::as_label()

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