强制评估传递给aes的变量的静态值

时间:2018-02-16 05:18:49

标签: r ggplot2

我正在我将用于许多ggplot图的函数中进行一些计算,因此我需要能够使用该计算的结果进行一些注释,然后将ggplot对象传递回全局环境。 / p>

library(ggplot2)

textDf<- data.frame(x=3,mytext="HELLO WORLD")

ggplot(mpg, aes(x = displ, y = hwy)) + geom_point()

annotate_it <- function(g, textDf) {
  yLimMax <- layer_scales(g)$y$range$range[2]
  yAnnotate <- yLimMax / 2 #calculations are more complicated in the real use case
  g<-g+  geom_text(data=textDf,aes(x=x,y=yAnnotate, label = mytext) )
  return (g)
}

g<- annotate_it(g,textDf)
g

这导致错误Error in FUN(X[[i]], ...) : object 'yAnnotate' not found,因为yAnnotate是函数的本地。

是否有某种方法可以将yAnnotate转换为静态(是正确的术语?)值?

如果有,在这种情况下,它将产生plot I want

以下的图

1 个答案:

答案 0 :(得分:2)

以下似乎是一个很好的解决方法。

  g <- g + geom_text(data=textDf, aes(x=x, y = 0, label = mytext),
                                               nudge_y = yAnnotate)

编辑

ggplot对象的环境更改为函数环境时,它似乎采用aes中的本地对象。

annotate_it <- function(g, textDf) {

  g$plot_env <- environment()

  yLimMax <- layer_scales(g)$y$range$range[2];
  yAnnotate <- yLimMax / 2; 
  g <- g + geom_text(data = textDf, 
                      aes(x = x, label = mytext, y = yAnnotate))
  return (g)
}