我试图用一个局部变量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
似乎已认准了YMul
在data
数据框架的第一个,如果没有找到,则在全球环境中。 我喜欢这样的变量添加到数据帧,如下,因为这对我来说很有意义概念。 我也不必担心更改不必职能预料的后果全局变量。 但是,所有其他的答案是也是正确的。 因此,无论使用哪一个适合你。
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