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

标签 r ggplot2

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

相关文章:

python - 在 Spark 中导入具有不同 header 的 DataFrame 中的多个 csv

sql - DBI/ Spark : how to store the result in a Spark Dataframe?

r - GGally:从图中提取数据

r - 是否可以创建插图?

r - ggplot 中的条形图,每组条数不同

r - 在 ggplot/ggmap 中省略一些边框

r - 通过单击识别现有 splom 中的子面板

r - 使用purrr时如何定位错误和调试

r - 有什么方法可以将R生成的输出直接输入到Hive表中。

r - ggplot 线条颜色 "black"变成红色