【发布时间】:2020-03-30 14:35:32
【问题描述】:
我有一个函数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() 合并到一个包中效果很好,我可以交互地调用它。但是,load_all() 之后的 call_plot() 会导致错误。这是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.
我相信这是由于整洁评估的一些特质。但是,我真的找不到任何关于在 R 包中使用 tidyeval 的特性的来源。我唯一知道的是,我不能真正直接使用带引号的变量,而是使用.data$variable 模式,我在call_plot() 中这样做了。
如何使用 adjust stacked_plot() 使其可用于其他包函数?
【问题讨论】:
-
@akrun 给出了一个很好的答案,但实际上,如果您尝试在您的
call_plot函数中调用stacked_plot(what = v1, by = cat),您的设置将起作用。
标签: r dplyr r-package rlang tidyeval