局部变量在AES局部变量在AES(Local Variables Within aes)

2019-05-14 08:28发布

我试图用一个局部变量aes当我ggplot绘制。 这是我的问题归结为本质:

xy <- data.frame(x=1:10,y=1:10)

plotfunc <- function(Data,YMul=2){
    ggplot(Data,aes(x=x,y=y*YMul))+geom_line()
}

plotfunc(xy)

这将导致以下错误:

Error in eval(expr, envir, enclos) : object 'YMul' not found

看来,如果我不能在局部变量(或函数参数) aes 。 难道是它的内容occurrs由于aes后执行时局部变量超出范围? 我怎么能(比不使用内的局部变量其他避免这个问题aes )?

Answer 1:

我想捕捉当地的环境,

xy <- data.frame(x=1:10,y=1:10)

plotfunc <- function(Data, YMul = 2){
    .e <- environment()
    ggplot(Data, aes(x = x, y = y*YMul), environment = .e) + geom_line()
}

plotfunc(xy)


Answer 2:

下面是一个可以让你在通过任何值传递的替代YMul参数,而无需将其添加到Data data.frame或全球环境:

plotfunc <- function(Data, YMul = 2){
    eval(substitute(
        expr = {
            ggplot(Data,aes(x=x,y=y*YMul)) + geom_line()
        }, 
        env = list(YMul=YMul)))
    }

plotfunc(xy, YMul=100)

要看到这是如何工作,尝试在隔离的行:

substitute({ggplot(Data, aes(x=x, y=y*YMul))}, list(YMul=100))


Answer 3:

ggplot()aes预计YMul成为内的可变data的数据帧。 尝试包括YMull有代替:

由于@Justin: ggplot()aes似乎已认准了YMuldata数据框架的第一个,如果没有找到,则在全球环境中。 我喜欢这样的变量添加到数据帧,如下,因为这对我来说很有意义概念。 我也不必担心更改不必职能预料的后果全局变量。 但是,所有其他的答案是也是正确的。 因此,无论使用哪一个适合你。

require("ggplot2")
xy <- data.frame(x = 1:10, y = 1:10)
xy <- cbind(xy, YMul = 2)

ggplot(xy, aes(x = x, y = y * YMul)) + geom_line()

或者,如果你想在你的榜样作用:

plotfunc <- function(Data, YMul = 2)
{
    ggplot(cbind(Data, YMul), aes(x = x, y = y * YMul)) + geom_line()
}

plotfunc(xy)


Answer 4:

我使用GGPLOT2,和你的例子似乎正常工作与当前版本。

然而,很容易拿出仍制造麻烦的变体。 我自己被类似的行为感到困惑,那就是我发现这个职位(上谷歌结果为“ggplot如何在传递变量求值”)。 举例来说,如果我们移动ggplot出plotfunc的:

xy <- data.frame(x=1:10,y=1:10)

plotfunc <- function(Data,YMul=2){
  geom_line(aes(x=x,y=y*YMul))
}

ggplot(xy)+plotfunc(xy)
# Error in eval(expr, envir, enclos) : object 'YMul' not found

在上述变型中,“捕获本地环境”不是一个解决方案,因为ggplot不从函数中调用,并且仅ggplot具有“环境=”参数。

但现在有功能的家庭“aes_”,“aes_string”,“aes_q”,这是喜欢“AES”,但是采集的局部变量。 如果我们在上面使用“aes_”,我们仍然得到一个错误,因为现在不知道“X”。 但是,很容易直接引用数据,从而解决了这个问题:

plotfunc <- function(Data,YMul=2){
  geom_line(aes_(x=Data$x,y=Data$y*YMul))
}
ggplot(xy)+plotfunc(xy)
# works


Answer 5:

你看着由@wch(W.昌)给出的解决方案?

https://github.com/hadley/ggplot2/issues/743

我认为这是最好的一个

本质上就是这样@baptiste,但包括在通话中提及的直接环境ggplot

我这里举报

g <- function() {
  foo3 <- 4
  ggplot(mtcars, aes(x = wt + foo3, y = mpg),
         environment = environment()) +
    geom_point()
}

g()
# Works


Answer 6:

如果它的工作原理功能之外执行代码。 如果你在函数内执行代码YMul全局定义的,它的工作原理。 我不完全了解的内部工作ggplot但这个工程...

YMul <- 2

plotfunc <- function(Data){
    ggplot(Data,aes(x=x,y=y*YMul))+geom_line()
}

plotfunc(xy)


文章来源: Local Variables Within aes
标签: r ggplot2