Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将函数参数同时传递给dplyr和ggplot_R_Ggplot2_Dplyr_Rlang_Tidyeval - Fatal编程技术网

将函数参数同时传递给dplyr和ggplot

将函数参数同时传递给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代码感到困惑。 我使用的是最新版本的dplyr和ggplot2 这是我生成条形图的代码(清晰度与平均价格)

对于dplyr的最新版本,带下划线的动词_uuz()被轻轻地弃用。看来我们应该使用Quosure

我的问题是:

  • 有人能澄清一下目前的最佳实践吗
  • 上面的代码有什么问题?(请不要用下划线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)