将函数参数同时传递给dplyr和ggplot
我对如何将函数参数传递到dplyr和ggplot代码感到困惑。 我使用的是最新版本的dplyr和ggplot2 这是我生成条形图的代码(清晰度与平均价格) 对于dplyr的最新版本,带下划线的动词_uuz()被轻轻地弃用。看来我们应该使用Quosure 我的问题是:将函数参数同时传递给dplyr和ggplot,r,ggplot2,dplyr,rlang,tidyeval,R,Ggplot2,Dplyr,Rlang,Tidyeval,我对如何将函数参数传递到dplyr和ggplot代码感到困惑。 我使用的是最新版本的dplyr和ggplot2 这是我生成条形图的代码(清晰度与平均价格) 对于dplyr的最新版本,带下划线的动词_uuz()被轻轻地弃用。看来我们应该使用Quosure 我的问题是: 有人能澄清一下目前的最佳实践吗 上面的代码有什么问题?(请不要用下划线dplyr动词.) 在ggplot中,我知道我们可以使用aes_string(),但在我的例子中,aes中只有一个参数是从函数参数传递的 提前感谢。我认为您还
- 有人能澄清一下目前的最佳实践吗李>
- 上面的代码有什么问题?(请不要用下划线dplyr动词.)
- 在ggplot中,我知道我们可以使用aes_string(),但在我的例子中,aes中只有一个参数是从函数参数传递的
提前感谢。我认为您还不能完全理解“正确”的方式,因为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)
库(tidyverse)
图书馆(rlang)
diamond_datasinQueso的答案是有希望的,但它忽略了函数的目的,即适应不同的数据帧。“price”变量在函数中编码如下:
summarise(price=mean(!!quo_metric)) %>%
因此,只有当输入变量为“price”时,此函数才会起作用
以下是一个更好的解决方案,可用于任何数据帧:
diamond_plot <- function (data, group, metric) {
quo_group <- sym(group)
quo_metric <- sym(metric)
summary <- data %>%
group_by(!!quo_group) %>%
summarise(mean=mean(!!quo_metric))
ggplot(summary, aes_string(x = group, y= "mean")) +
geom_bar(stat='identity')
}
diamond_plot(diamonds, "clarity", "price")
diamond\u plot您甚至可以比Daniel的解决方案更进一步,以便汇总变量(度量)的名称随输入而变化
diamond_plot <- function(data, group, metric) {
quo_group <- rlang::sym(group)
quo_metric <- rlang::sym(metric)
metric_name <- rlang::sym(stringr::str_c("mean_", metric))
data %>%
group_by(!!quo_group) %>%
summarize(!!metric_name := mean(!!quo_metric)) %>%
ggplot(aes_(x = quo_group, y = metric_name)) +
geom_bar(stat = 'identity')
}
diamond_plot(diamonds, "clarity", "price")
diamond\u plot在我看来,解决这个问题最“简洁”的方法是将quo\u name
和aes\u string
函数组合起来。避免使用尾随下划线动词,如aes\uu
,因为它们已被弃用
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)
diamond\u plotTidy求值现在在中完全受支持,因此不再需要使用aes\u
或aes\u string
库(rlang)
图书馆(tidyverse)
菱形图%
ggplot(aes(x=!!quo_组,y=!!quo_度量))+
geom_col()
}
钻石图(钻石、清晰度、价格)
由(v0.2.0)于2018年4月16日创建。在这种情况下,我只会使用sym()
(或as.name()
)而不是parse_quosure()
。谢谢@lionel的建议,我更新了我的answer@lionel你能解释一下为什么你更喜欢sym()而不是parse_quosure吗?因为函数需要列名,与可能引用上下文对象的符号相反。解析还将创建表达式,而不仅仅是符号,这在这里是不合适的。解析任意代码通常是不好的风格。最后,符号可以同时传递给dplyr函数和aes_u3;()
函数,而aes_3;()
不支持QUOSURE。使用符号而不是quosured符号当然假设名称引用的是列,而不是上下文中的对象,这在这里似乎是合理的。
summarise(price=mean(!!quo_metric)) %>%
diamond_plot <- function (data, group, metric) {
quo_group <- sym(group)
quo_metric <- sym(metric)
summary <- data %>%
group_by(!!quo_group) %>%
summarise(mean=mean(!!quo_metric))
ggplot(summary, aes_string(x = group, y= "mean")) +
geom_bar(stat='identity')
}
diamond_plot(diamonds, "clarity", "price")
diamond_plot <- function(data, group, metric) {
quo_group <- rlang::sym(group)
quo_metric <- rlang::sym(metric)
metric_name <- rlang::sym(stringr::str_c("mean_", metric))
data %>%
group_by(!!quo_group) %>%
summarize(!!metric_name := mean(!!quo_metric)) %>%
ggplot(aes_(x = quo_group, y = metric_name)) +
geom_bar(stat = 'identity')
}
diamond_plot(diamonds, "clarity", "price")
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)