首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将函数参数传递给dplyr和ggplot。

将函数参数传递给dplyr和ggplot。
EN

Stack Overflow用户
提问于 2017-08-01 13:52:27
回答 5查看 3.2K关注 0票数 16

我很困惑如何将函数参数传递给dplyr和ggplot代码。我正在使用dplyr和ggplot2的最新版本,这里是我的代码,用来生成一个标杆(清晰性与平均价格)

代码语言:javascript
复制
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')

错误:

代码语言:javascript
复制
Error in UseMethod("group_by_") : no applicable method for 'group_by_' applied to an object of class "packageIQR"

对于最新版本的dplyr,强调的verbs_()被轻柔地废弃。看来我们应该用商。

我的问题:

  • 有人能澄清这方面目前的最佳实践吗?
  • 上面的代码有什么问题?(请不要下划线dplyr动词。)
  • 在ggplot中,我知道我们可以使用aes_string(),但在我的示例中,只有一个参数是从函数参数传递的。

提前谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-04-17 05:39:28

ggplot2 v3.0.0现在完全支持整洁评估,因此不再需要使用aes_aes_string

代码语言:javascript
复制
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)。

票数 8
EN

Stack Overflow用户

发布于 2017-08-01 14:36:54

我认为您还不能用“正确”的方式,因为ggplot2不支持tidyeval语法,但它即将到来。

使用代码的dplyr部分的最佳实践是:

代码语言:javascript
复制
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缺乏支持的问题,您可以这样做(注意函数调用中变量的引号):

代码语言:javascript
复制
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")

编辑 --以下是莱昂内尔的评论:

代码语言:javascript
复制
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")
票数 6
EN

Stack Overflow用户

发布于 2018-01-31 09:59:59

在我看来,解决这个问题的最"tidyeval“方法是quo_nameaes_string函数的组合。避免使用像aes_这样的下划线动词,因为它们已经被废弃了。

代码语言:javascript
复制
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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45439813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档