gpt4 book ai didi

r - 创建 ggplot2 函数并根据 ggplot2 标准功能将参数指定为数据中的变量

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

我想创建一个绘图函数,在其中指定数据集,并以类似的方式将绘图参数指定为函数参数 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)

会返回:
wonderful plot

但是它返回:
> 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")

enter image description here

如果我们要传递带引号或不带引号的参数,则将 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/

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