为什么ifelse返回“找不到对象”错误?

时间:2019-04-23 12:15:01

标签: r if-statement ggplot2

我正在尝试构建ggplot,但在这里遇到错误:

ggplot(nelMonthly) +
  geom_col(aes(month,
               overUnder,
           fill = ifelse(overUnder > 0, "red", "grey")),
           colour = "black") +
  geom_text(aes(month, overUnder, label = overUnder),
                  vjust = ifelse(overUnder > 0, -0.25, 1), # THIS LINE THROWS THE ERROR
                  size = 3,
                  colour = "black")

这将返回:

Error in ifelse(overUnder > 0, -0.25, 1) : object 'overUnder' not found

但是,如果我在ifelse条件中明确指定了数据框,则它可以正常工作:

ggplot(nelMonthly) +
  geom_col(aes(month,
               overUnder,
           fill = ifelse(overUnder > 0, "red", "grey")),
           colour = "black") +
  geom_text(aes(month, overUnder, label = overUnder),
                  vjust = ifelse(nelMonthly$overUnder > 0, -0.25, 1),
                  size = 3,
                  colour = "black")

我的问题是,这根本不是应该编程的方式,因为数据帧是在ggplot(df)内部传递的。

我在这里想念东西吗?

为什么会这样,我该如何纠正?

1 个答案:

答案 0 :(得分:5)

因为在geom_col中,我们在fill内有aes参数,而在geom_text中,我们在vjust内有aes参数。

?aes的文档说明了原因:

  

aes()是一个引用函数。这意味着引用其输入是为了在数据的上下文中进行评估。这样就可以轻松使用数据框中的变量,因为您可以直接命名这些变量

因此,在aes中,R知道要在传递给overUnder参数的对象中寻找data=。但是,在aes之外,R使用其正常行为并在全局环境中寻找overUnder对象。