gpt4 book ai didi

r - 使用 ggplot2 和 dplyr 编程

转载 作者:行者123 更新时间:2023-12-04 09:11:56 24 4
gpt4 key购买 nike

我想使用管道将 dplyrggplot 组合在一个函数中,现在正在努力解决一些问题。

这是第一个有效的简单方法。该函数采用数据框并按指定的列和值进行过滤。

foo <- function(df, y, t = 4){
tmp <- df %>%
filter(!!enquo(y) > t)
ggplot(tmp, aes_(substitute(y))) +
geom_histogram()
}
foo(mtcars, cyl)

现在我正尝试直接通过管道传输到 ggplot 函数...给出错误

foo <- function(df, y, t=4){
df %>%
filter(!!enquo(y) > t) %>%
ggplot(aes_(substitute(y))) +
geom_histogram()
}
foo(mtcars, cyl)

Error in FUN(X[[i]], ...) : object 'cyl' not found In addition: Warning message: In FUN(X[[i]], ...) : restarting interrupted promise evaluation

最后一个。如何添加切面?

foo <- function(df, y, gr, t=4){
df %>%
filter(!!enquo(y) > t) %>%
ggplot(aes_(substitute(y))) +
geom_histogram() +
facet_grid(~gr)
}
foo(mtcars, y= cyl, gr= vs)

编辑

第二个问题可以使用 aes_q 而不是 aes_ & substitute 来解决。 Source

foo <- function(df, y, gr, t=4){
y <- enquo(y)
df %>%
filter(!!y > t) %>%
ggplot(aes_q(y)) +
geom_histogram()
}
foo(mtcars, cyl)

使用 ggplot2_2.2.1

最佳答案

ggplot2 v3.0.0 2018 年 7 月发布,支持 !! (bang bang)、!!!:=

facet_wrap()facet_grid() 支持 vars() 输入。 facet_grid() 的前两个参数变为 rowscolsfacet_grid(vars(cyl), vars(am, vs)) 等同于 facet_grid(cyl ~ am + vs)facet_grid(cols = vars(am , vs)) 等同于 facet_grid(. ~ am + vs)

所以你的例子可以修改如下:

library(rlang)
library(tidyverse)

foo <- function(df, y, gr, t=4) {
y <- enquo(y)
gr <- enquo(gr)

df %>%
filter(!!y > t) %>%
ggplot(aes(!!y)) +
geom_histogram() +
facet_grid(cols = vars(!!gr))
}

foo(mtcars, y= cyl, gr= vs)
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

reprex package 创建于 2018-04-04 (v0.2.0).

关于r - 使用 ggplot2 和 dplyr 编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49646781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com