当我使用ggplot绘图时,我尝试在aes中使用局部变量。这是我的问题归结为本质:
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中使用局部变量(或函数参数)。会不会是因为当局部变量超出作用域时,aes的内容才会被执行?我如何避免这个问题(除了在aes中不使用局部变量)?
发布于 2012-05-19 14:33:07
我会捕捉当地的环境,
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)发布于 2012-05-19 04:50:14
下面是另一种方法,它允许您通过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))发布于 2016-03-08 03:39:04
我使用的是ggplot2,您的示例在当前版本中似乎工作得很好。
然而,很容易提出仍然制造麻烦的变体。我自己也被类似的行为搞糊涂了,这就是我找到这篇文章的原因(谷歌搜索结果排名靠前的是"ggplot how to evaluate variables when passed")。例如,如果我们将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有"environment=“参数。
但是现在有一系列函数"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)
# workshttps://stackoverflow.com/questions/10659133
复制相似问题