如何解决使用dplyr--列进行问题编程,这绝对是一个作为公式选择的向量
我正在编写一个函数来再现多个图表,这些图表都将使用highcharter进行类似的格式化(以及其他操作)。如果名称更改,或者我想做一些不同的事情并且我想用{{ }}
来包围这些参数,我希望能够选择数据集的不同列。但是然后我得到这个奇怪的错误:
Error: Problem with `mutate()` input `x`.
x Input `x` must be a vector,not a `formula` object.
i Input `x` is `~Year`.
这是我的(最低可复制性)代码:
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,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,10.442,9.969,73.759,8.855)),row.names = c(NA,-6L),groups = structure(list(
Year = c(2016,.rows = structure(list(1L,2:3,4:6),ptype = integer(0),class = c("vctrs_list_of","vctrs_vctr","list"))),3L),class = c("tbl_df","tbl","data.frame"),.drop = TRUE),class = c("grouped_df","tbl_df","data.frame"))
解决方法
{{a}}
是!!enquo(a)
的简写,它捕获提供给a
的表达式以及应评估该表达式的上下文。在您的情况下,上下文是数据帧,该数据帧已被提供给函数。因此,在这里使用的更好的rlang
动词是ensym(a)
,它代替了提供给a
的符号名称:
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)))
}
作为奖励,该函数现在可以使用符号和字符串:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。