我想创建一个绘图函数,在其中指定数据集,并以类似的方式将绘图参数指定为函数参数 ggplot2
,即我们在没有数据集的情况下指定变量名称的地方,例如hp
而不是 mtcars$hp
.
例如:
ggfun <- function(dat, x.var, y.var){
ggp <- ggplot(data = dat,
aes(x = x.var,
y = y.var)) +
geom_point()
return(ggp)
}
ggfun(dat = mtcars, x.var = drat, y.var = hp)
会返回:
但是它返回:
> ggfun(dat = mtcars, x.var = drat, y.var = hp)
Error in eval(expr, envir, enclos) : object 'drat' not found
In addition: Warning message:
In eval(expr, envir, enclos) : restarting interrupted promise evaluation
我知道 using
aes_string
instead of aes
works ,例如:ggfun <- function(dat, x.var, y.var){
ggp <- ggplot(data = dat,
aes_string(x = x.var,
y = y.var)) +
geom_point()
return(ggp)
}
ggfun(dat = mtcars, x.var = "drat", y.var = "hp")
但我更愿意避免使用字符串形式。
其他尝试包括
ggfun(dat = mtcars, x.var = mtcars$drat, y.var = mtcars$hp)
,它返回正确的图形,但部分违背了练习的目的,并产生了标签“x.var”和“y.var”而不是“drat”和“hp”。任何已知且相当简单的方法来解决这个问题?
最佳答案
与开发版 ggplot2
,我们可以传递不带引号的参数,将其转换为 quosure
(使用 enquo
)并对其进行评估( !!
)
ggfun <- function(dat, x.var, y.var){
x.var <- enquo(x.var)
y.var <- enquo(y.var)
ggp <- ggplot(data = dat,
aes(x = !! x.var,
y = !! y.var)) +
geom_point()
return(ggp)
}
ggfun(dat = mtcars, x.var = drat, y.var = hp)
对于带引号的字符串,使用
sym
将其转换为符号(来自 rlang
)并进行评估ggfun <- function(dat, x.var, y.var){
x.var <- rlang::sym(x.var)
y.var <- rlang::sym(y.var)
ggp <- ggplot(data = dat,
aes(x = !! x.var,
y = !! y.var)) +
geom_point()
return(ggp)
}
ggfun(dat = mtcars, x.var = "drat", y.var = "hp")
如果我们要传递带引号或不带引号的参数,则将 quosure 更改为字符 (
quo_name
),然后更改为符号 ( sym
) 并求值 ( !!
)ggfun <- function(dat, x.var, y.var){
x.var <- rlang::sym(quo_name(enquo(x.var)))
y.var <- rlang::sym(quo_name(enquo(y.var)))
ggp <- ggplot(data = dat,
aes(x = !! x.var,
y = !! y.var)) +
geom_point()
return(ggp)
}
p1 <- ggfun(dat = mtcars, x.var = drat, y.var = hp)
p2 <- ggfun(dat = mtcars, x.var = "drat", y.var = "hp")
all.equal(p1, p2)
#[1] TRUE
关于r - 创建 ggplot2 函数并根据 ggplot2 标准功能将参数指定为数据中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50960339/