本文介绍了使用dplyr--列进行问题编程,这绝对是一个作为公式选择的向量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个函数,以使用highcharter再现几张具有相似格式(和其他内容)的图表.我希望能够在名称更改时或者如果我想做一些不同的事情来选择数据集的不同列,并且我正在使用 {{}} embracing >.但是然后我得到了这个奇怪的错误:

I'm writing a function to reproduce several charts that will all have similar formatting (and other stuff) using highcharter. I want to be able select different columns of the data set should the names change or if I want to be doing something different and I'm embracing those arguments with {{ }}. But then I get this weird error:

Error: Problem with `mutate()` input `x`.
x Input `x` must be a vector, not a `formula` object.
i Input `x` is `~Year`.

这是我的代码(最低可重现性):

Here's my (minimal reproducible) code:

library(dplyr)
library(highcharter)

plot_high_chart <- function(.data,
                            chart_type = "column",
                            x_value = Year,
                            y_value = total,
                            group_value = service) {
  .data %>%
  hchart(chart_type, hcaes(x = {{x_value}}, y = {{y_value}}, group = {{group_value}}))
}

data %>% plot_high_chart()

,这是数据的 dput 结果:

structure(list(Year = c(2016, 2017, 2017, 2018, 2018, 2018),
    service = structure(c(10L, 3L, 9L, 5L, 7L, 9L), .Label = c("Defense Logistics Agency",
    "Chemical and Biological Defense Program", "Defense Information Systems Agency",
    "United States Special Operations Command", "Office of the Secretary Of Defense",
    "Missile Defense Agency", "Defense Advanced Research Projects Agency",
    "Navy", "Army", "Air Force"), class = "factor"), total = c(9.435,
    0, 10.442, 9.969, 73.759, 8.855)), row.names = c(NA, -6L), groups = structure(list(
    Year = c(2016, 2017, 2018), .rows = structure(list(1L, 2:3,
        4:6), ptype = integer(0), class = c("vctrs_list_of",
    "vctrs_vctr", "list"))), row.names = c(NA, 3L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))

推荐答案

{{a}} !! enquo(a)的简写,它捕获表达式提供给 a 以及应评估此表达式的上下文.在您的情况下,上下文是数据帧,该数据帧已被提供给函数.因此,在这里使用的更好的 rlang 动词是 ensym(a),它捕获提供给 a 的符号名称:

{{a}} is shorthand for !!enquo(a), which captures the expression provided to a as well as the context where this expression should be evaluated. In your case, the context is the data frame, which is already being provided to the function. So, a better rlang verb to use here is ensym(a), which captures the symbol name provided to a instead:

plot_high_chart <- function(.data,
                            chart_type = "column",
                            x_value = "Year",             # <-- Note: strings
                            y_value = "total",
                            group_value = "service") {
  .data %>%
      hchart(chart_type, hcaes(x = !!rlang::ensym(x_value),    # <- ensym instead of {{
                               y = !!rlang::ensym(y_value),
                               group = !!rlang::ensym(group_value)))
}

作为奖励,该函数现在可以使用符号和字符串:

As a bonus, the function will now work with symbols AND with strings:

data %>%
   plot_high_chart(x_value= "Year", y_value= "total", group_value= "service")    # Works
data %>%
   plot_high_chart(x_value= Year, y_value= total, group_value= service)     # Also Works

这篇关于使用dplyr--列进行问题编程,这绝对是一个作为公式选择的向量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-31 02:27