Использование tidy eval в пакетах R - PullRequest
1 голос
/ 30 марта 2020

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

stacked_plot <- function(data, what, by = NULL, date_col = date){

  by <- rlang::enquo(by)
  what <- rlang::ensym(what)
  date_col <- rlang::ensym(date_col)
  data <- data %>%
    dplyr::group_by(!!date_col, !!by) %>%
    dplyr::summarise(!!what := sum(!!what, na.rm = TRUE)) %>%
    dplyr::ungroup() %>%
    tidyr::complete(!!date_col, !!by, fill = rlang::list2(!!what := 0))

  p <- data %>%
    ggplot2::ggplot(ggplot2::aes(!!date_col, !!what, fill = !!by)) +
    ggplot2::geom_area(position = 'stack')
  print(p)
}

#' @importFrom rlang .data
call_plot <- function() {
  to_plot <- data.frame(date = rep(seq(lubridate::ymd('2020-01-01'),
                                       lubridate::ymd('2020-03-30'),
                                       by = '1 day'), each = 3)) %>%
    dplyr::mutate(cat = rep(c('A', 'B', 'C'), 90), v1 = runif(270))

  p <- to_plot %>%
    stacked_plot(what = .data$v1, by = .data$cat)
  return(p)
}

Включение stacked_plot() в пакет работало нормально, и я могу вызвать его в интерактивном режиме. Однако call_plot() после load_all() приводит к ошибке. Вот вывод rlang::last_error():

rlang::last_error()
<error/rlang_error>
Only strings can be converted to symbols
Backtrace:
  1. global::call_plot()
 10. mmmtools::stacked_plot(., what = .data$v1, by = .data$cat)
 11. rlang::ensym(what) R/stacked_plot.R:4:2
Run `rlang::last_trace()` to see the full context.

Я полагаю, что это связано с некоторой особенностью аккуратной оценки. Однако я не могу найти какой-либо источник информации об особенностях использования tidyeval в пакетах R. Единственное, что я знаю, это то, что я не могу использовать переменные в кавычках напрямую и использовать шаблон .data$variable, что я и сделал в call_plot().

Как я могу использовать Adjust stacked_plot(), чтобы использовать его из других функций пакета?

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