我正在尝试构建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)
内部传递的。
我在这里想念东西吗?
为什么会这样,我该如何纠正?
答案 0 :(得分:5)
因为在geom_col
中,我们在fill
内有aes
参数,而在geom_text
中,我们在vjust
内有aes
参数。
?aes
的文档说明了原因:
aes()是一个引用函数。这意味着引用其输入是为了在数据的上下文中进行评估。这样就可以轻松使用数据框中的变量,因为您可以直接命名这些变量
因此,在aes
中,R知道要在传递给overUnder
参数的对象中寻找data=
。但是,在aes
之外,R使用其正常行为并在全局环境中寻找overUnder
对象。