我很困惑如何将函数参数传递给dplyr和ggplot代码。我正在使用dplyr和ggplot2的最新版本,这里是我的代码,用来生成一个标杆(清晰性与平均价格)
diamond.plot<- function (data, group, metric) {
group<- quo(group)
metric<- quo(metric)
data() %>% group_by(!! group) %>%
summarise(price=mean(!! metric)) %>%
ggplot(aes(x=!! group,y=price))+
geom_bar(stat='identity')
}
diamond.plot(diamonds, group='clarity', metric='price')错误:
Error in UseMethod("group_by_") : no applicable method for 'group_by_' applied to an object of class "packageIQR"对于最新版本的dplyr,强调的verbs_()被轻柔地废弃。看来我们应该用商。
我的问题:
提前谢谢。
发布于 2018-04-17 05:39:28
ggplot2 v3.0.0现在完全支持整洁评估,因此不再需要使用aes_或aes_string。
library(rlang)
library(tidyverse)
diamond_plot <- function (data, group, metric) {
quo_group <- sym(group)
quo_metric <- sym(metric)
data %>%
group_by(!! quo_group) %>%
summarise(price = mean(!! quo_metric)) %>%
ggplot(aes(x = !! quo_group, y = !! quo_metric)) +
geom_col()
}
diamond_plot(diamonds, "clarity", "price")

由reprex封装创建于2018-04-16 (v0.2.0)。
发布于 2017-08-01 14:36:54
我认为您还不能用“正确”的方式,因为ggplot2不支持tidyeval语法,但它即将到来。
使用代码的dplyr部分的最佳实践是:
library(tidyverse)
library(rlang)
diamond_data <- function (data, group, metric) {
quo_group <- enquo(group)
quo_metric <- enquo(metric)
data %>%
group_by(!!quo_group) %>%
summarise(price=mean(!!quo_metric))
}
diamond_data(diamonds, clarity, price)要解决ggplot2中对tidyeval缺乏支持的问题,您可以这样做(注意函数调用中变量的引号):
diamond_plot <- function (data, group, metric) {
quo_group <- parse_quosure(group)
quo_metric <- parse_quosure(metric)
data %>%
group_by(!!quo_group) %>%
summarise(price=mean(!!quo_metric)) %>%
ggplot(aes_(x = as.name(group), y=as.name(metric)))+
geom_bar(stat='identity')
}
diamond_plot(diamonds, "clarity", "price")编辑 --以下是莱昂内尔的评论:
diamond_plot <- function (data, group, metric) {
quo_group <- sym(group)
quo_metric <- sym(metric)
data %>%
group_by(!!quo_group) %>%
summarise(price=mean(!!quo_metric)) %>%
ggplot(aes_(x = quo_group, y= quo_metric)) +
geom_bar(stat='identity')
}
diamond_plot(diamonds, "clarity", "price")发布于 2018-01-31 09:59:59
在我看来,解决这个问题的最"tidyeval“方法是quo_name和aes_string函数的组合。避免使用像aes_这样的下划线动词,因为它们已经被废弃了。
diamond_plot <- function(data, group, metric) {
quo_group <- enquo(group)
str_group <- quo_name(quo_group)
quo_metric <- enquo(metric)
summary <- data %>%
groupby(!!quo_group) %>%
summarise(mean = mean(!!quo_metric))
ggplot(summary) +
geom_bar(aes_string(x = str_group, y = "mean"), stat = "identity")
}
diamond_plot(diamnonds, clarity, price)https://stackoverflow.com/questions/45439813
复制相似问题