ggplot2 中的 lazyeval 在其他函数中
lazyeval in ggplot2 within other function
我有一个问题,我在这个 solution 中找不到答案。我的意思是,我想在新函数中使用 ggplot
函数,例如
library(ggplot2)
draw_point <- function(data, x, y ){
ggplot(data, aes_string(x, y)) +
geom_point()
}
结果我必须使用引号:
draw_point(mtcars, "wt", "qsec")
相反,我想以某种方式使用 lazyeval
包来编写不带引号的函数:
draw_point(mtcars, wt, qsec)
可以做到吗?
一种方法是使用 substitute
和 aes_q
。
draw_point <- function(data, x, y){
ggplot(data, aes_q(substitute(x), substitute(y))) +
geom_point()
}
draw_point(mtcars, wt, qsec)
但是,如果您希望 draw_point(mtcars, wt, qsec)
和 draw_point(mtcars, "wt", "qsec")
都起作用,则必须更有创意。
以下是您可以使用 lazyeval
包执行的操作的初稿。这不能处理所有情况,但它应该可以帮助您入门。
draw_point <- function(data, x, y, ...){
# lazy x and y
ld <- as.lazy_dots(list(x = lazy(x), y = lazy(y)))
# combine with dots
ld <- c(ld, lazy_dots(...))
# change to names wherever possible
ld <- as.lazy_dots(lapply(ld, function(x){
try(x$expr <- as.name(x$expr), silent=TRUE)
x
}))
# create call
cl <- make_call(quote(aes), ld)
# ggplot command
ggplot(data, eval(cl$expr)) +
geom_point()
}
# examples that work
draw_point(mtcars, wt, qsec, col = factor(cyl))
draw_point(mtcars, "wt", "qsec")
draw_point(mtcars, wt, 'qsec', col = factor(cyl))
# examples that doesn't work
draw_point(mtcars, "wt", "qsec", col = "factor(cyl)")
我有一个问题,我在这个 solution 中找不到答案。我的意思是,我想在新函数中使用 ggplot
函数,例如
library(ggplot2)
draw_point <- function(data, x, y ){
ggplot(data, aes_string(x, y)) +
geom_point()
}
结果我必须使用引号:
draw_point(mtcars, "wt", "qsec")
相反,我想以某种方式使用 lazyeval
包来编写不带引号的函数:
draw_point(mtcars, wt, qsec)
可以做到吗?
一种方法是使用 substitute
和 aes_q
。
draw_point <- function(data, x, y){
ggplot(data, aes_q(substitute(x), substitute(y))) +
geom_point()
}
draw_point(mtcars, wt, qsec)
但是,如果您希望 draw_point(mtcars, wt, qsec)
和 draw_point(mtcars, "wt", "qsec")
都起作用,则必须更有创意。
以下是您可以使用 lazyeval
包执行的操作的初稿。这不能处理所有情况,但它应该可以帮助您入门。
draw_point <- function(data, x, y, ...){
# lazy x and y
ld <- as.lazy_dots(list(x = lazy(x), y = lazy(y)))
# combine with dots
ld <- c(ld, lazy_dots(...))
# change to names wherever possible
ld <- as.lazy_dots(lapply(ld, function(x){
try(x$expr <- as.name(x$expr), silent=TRUE)
x
}))
# create call
cl <- make_call(quote(aes), ld)
# ggplot command
ggplot(data, eval(cl$expr)) +
geom_point()
}
# examples that work
draw_point(mtcars, wt, qsec, col = factor(cyl))
draw_point(mtcars, "wt", "qsec")
draw_point(mtcars, wt, 'qsec', col = factor(cyl))
# examples that doesn't work
draw_point(mtcars, "wt", "qsec", col = "factor(cyl)")