I want to combine dplyr
and ggplot
within one function using piping and struggling with some issues now.
Here is the first easy one which is working. Function which takes a dataframe and filters by a specified column and value.
foo <- function(df, y, t = 4){
tmp <- df %>%
filter(!!enquo(y) > t)
ggplot(tmp, aes_(substitute(y))) +
geom_histogram()
}
foo(mtcars, cyl)
Now I'm trying to pipe directly to the ggplot function...gives an error
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
and the last one. How to add a facet?
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)
Edit
The second issue can be solved using aes_q
instead of 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)
Using ggplot2_2.2.1
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…