R语言 将表达式作为字符传递给ggplot2::aes()时使用整洁求值

amrnrhlw  于 2023-02-20  发布在  其他
关注(0)|答案(2)|浏览(123)

我试图将ggplot2在函数中的使用转换为使用整洁的求值,以避免求值时出现警告消息。(),这些需要转换为aes()。我可以处理只有列名作为字符传递的情况。但是,我一直无法工作如何处理的情况下,字符是一个数学表达式。
下面是我试图解决的问题的一个可重复的小例子。

library(ggplot2)
set.seed(1)

dat <- data.frame(x=rnorm(100),y=rnorm(100))
xvar <- 'x+100'
yvar <- 'y'

#This works but uses the deprecated aes_string
ggplot(dat,aes_string(x=xvar,y=yvar))

#This works
ggplot(dat, ggplot2::aes(x=x+100, y=.data[[yvar]]))  + geom_point()

#This does not work
ggplot(dat, aes(x={{xvar}}, y=.data[[yvar]])) + geom_point()

我的问题是,我需要使用什么简洁的求值技术才能像aes_string()那样使用xvar指定x变量?

xu3bshqb

xu3bshqb1#

您可以使用eval(str2expression())

library(ggplot2)

ggplot(dat, aes(x = eval(str2expression(xvar)), y = eval(str2expression(yvar)))) +
  geom_point() +
  labs(x = xvar, y = yvar)

或者使用类似的rlang函数:

library(rlang)

ggplot(dat, aes(x = eval_tidy(parse_expr(xvar)), y = eval_tidy(parse_expr(yvar)))) +
  geom_point() +
  labs(x = xvar, y = yvar)

注意,您可能希望使用labs()手动设置轴标签;否则你会得到,例如,x轴为"eval(str2expression(xvar))"

9w11ddsr

9w11ddsr2#

可能需要parse_expr/eval

library(ggplot2)
ggplot(dat, aes(x=eval(rlang::parse_expr(xvar)), y=.data[[yvar]])) + 
     geom_point() +
     xlab(xvar)
  • 输出

或者,另一种选择是插值并执行eval/parse

eval(parse(text = glue::glue("ggplot(dat, aes(x = {xvar}, y = {yvar}))",
    "+ geom_point()")))

相关问题