首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >aes中的局部变量

aes中的局部变量
EN

Stack Overflow用户
提问于 2012-05-19 04:15:48
回答 5查看 10.8K关注 0票数 47

当我使用ggplot绘图时,我尝试在aes中使用局部变量。这是我的问题归结为本质:

代码语言:javascript
复制
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)

这将导致以下错误:

代码语言:javascript
复制
Error in eval(expr, envir, enclos) : object 'YMul' not found

似乎我不能在aes中使用局部变量(或函数参数)。会不会是因为当局部变量超出作用域时,aes的内容才会被执行?我如何避免这个问题(除了在aes中不使用局部变量)?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-19 14:33:07

我会捕捉当地的环境,

代码语言:javascript
复制
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)
票数 39
EN

Stack Overflow用户

发布于 2012-05-19 04:50:14

下面是另一种方法,它允许您通过YMul参数传递任何值,而不必将其添加到Data data.frame或全局环境中:

代码语言:javascript
复制
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)

要了解这是如何工作的,请单独尝试以下代码行:

代码语言:javascript
复制
substitute({ggplot(Data, aes(x=x, y=y*YMul))}, list(YMul=100))
票数 10
EN

Stack Overflow用户

发布于 2016-03-08 03:39:04

我使用的是ggplot2,您的示例在当前版本中似乎工作得很好。

然而,很容易提出仍然制造麻烦的变体。我自己也被类似的行为搞糊涂了,这就是我找到这篇文章的原因(谷歌搜索结果排名靠前的是"ggplot how to evaluate variables when passed")。例如,如果我们将ggplot移出plotfunc:

代码语言:javascript
复制
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”。但是很容易直接参考数据,这就解决了问题:

代码语言:javascript
复制
plotfunc <- function(Data,YMul=2){
  geom_line(aes_(x=Data$x,y=Data$y*YMul))
}
ggplot(xy)+plotfunc(xy)
# works
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10659133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档