R ggplot中aes函数中反勾号和引号之间的差异
好吧,这有点奇怪。我在回答一个关于R ggplot中aes函数中反勾号和引号之间的差异,r,ggplot2,R,Ggplot2,好吧,这有点奇怪。我在回答一个关于geom_直方图的初学者的问题,OP发布了一个使用backticks的示例。他忘了添加数据,所以我编了出来,然后找到了答案,甚至没有注意到倒勾。但另一个(实际上更优雅的)答案没有反勾。它并没有真正起作用,但使用回跳时效果要好得多 但现在我感到困惑。我不明白为什么会有什么不同。即使ggplot列表几乎是相同的,但就我所见,只有ggplot$mapping元素是不同的(好吧,这是个大问题)。我在谷歌上搜索过,但我不知道发生了什么 下面是代码: 此(在aes中,围绕日
geom_直方图
的初学者的问题,OP发布了一个使用backticks的示例。他忘了添加数据,所以我编了出来,然后找到了答案,甚至没有注意到倒勾。但另一个(实际上更优雅的)答案没有反勾。它并没有真正起作用,但使用回跳时效果要好得多
但现在我感到困惑。我不明白为什么会有什么不同。即使ggplot列表几乎是相同的,但就我所见,只有ggplot$mapping
元素是不同的(好吧,这是个大问题)。我在谷歌上搜索过,但我不知道发生了什么
下面是代码:
此(在aes
中,围绕日志编号
引用):
更正确的说法是:
反勾号是在R中表示非标准变量名的标准方式。引号用于表示字符串。例如:
`bad name` = 1
`bad name`
# [1] 1
这不适用于引号
"bad name" = 1
"bad name"
# [1] "bad name"
一般来说,您不应该使用这些奇怪的、非标准的名称。但是,如果你不得不这样做,那就是方法。你几乎可以做任何事
`really-bad^name+violating*all()/[kinds] <- of == rules&!|` = 1
# works just fine
您可能希望所有y值都是1。你是对的
对于带引号的字符串,它是一样的:
ggplot(mtcars, aes(x = wt, y = "mpg")) + geom_point()
除了上面的y=1
案例中的数字之外,您为它指定了一个字符,该字符被隐式转换为离散y比例(只有一个值)的因子(只有一个级别)。不管是否有名为“mpg”的列,因为您刚刚传递了一个值ggplot
不查找名为mpg
的列,就像在第一个示例中不查找名为1
的列一样
使用反勾号,可以给ggplot
一个R识别为对象名的东西,而不仅仅是像1
或“某个字符串”
这样的值。因此,ggplot
确实在查找具有该名称的列
# both of these work
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
ggplot(mtcars, aes(x = wt, y = `mpg`)) + geom_point()
虽然反勾号确实有效,并且在
aes()
中设置常量通常有效,但这两种方法都不推荐。设置常量的首选方法是在aes()之外设置常量。这是保证在更复杂的情节中一切都能顺利进行的唯一方法。特别是,如果您试图在aes()
(尤其是转换)中执行奇怪的操作,facet通常会出错或无法产生预期的结果
对于非标准列名,aes_string()
工作得很好,然后它希望美学映射引用列名。如果您正在编写一个创建ggplot并需要将列名作为参数的函数,那么这也是一种很好的方法
ggplot(mtcars, aes_string(x = "wt", y = "mpg")) + geom_point()
# or, in a variable
my_y_column = "mpg"
ggplot(mtcars, aes_string(x = "wt", y = my_y_column)) + geom_point()
另一个很好的例子是,由于@TheTime,我们开始从引擎盖下观察:
最后,ggplot
需要评估所有内容,这将通过eval
完成。考虑以下事项:
a <- 1
eval(parse(text="a"))
# [1] 1
eval(parse(text='"a"'))
# [1] "a"
eval(parse(text="`a`"))
# [1] 1
a我不确定,但这可能提供一些见解。试着看看aes(x=“lon”,fill=state)
vsaes(x=lon,fill=state)
vsaes(x=`lon`,fill=state)
的输出,加上引号,你会得到一个字符,但没有引号或反勾,你会得到一个符号。回答很好。谢谢。我刚刚注意到Hadley的Advanced R书中也提到了这一点:-在“将名称绑定到值”一节中。
# both of these work
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
ggplot(mtcars, aes(x = wt, y = `mpg`)) + geom_point()
# better than above, set a constant outside of `aes()`
# Here I set y as a constant which is a bit unusual
ggplot(mtcars, aes(x = wt)) + geom_point(y = 1)
# aesthetics that are more commonly set to constants are
# size, color, fill, etc.
ggplot(mtcars, aes_string(x = "wt", y = "mpg")) + geom_point()
# or, in a variable
my_y_column = "mpg"
ggplot(mtcars, aes_string(x = "wt", y = my_y_column)) + geom_point()
a <- 1
eval(parse(text="a"))
# [1] 1
eval(parse(text='"a"'))
# [1] "a"
eval(parse(text="`a`"))
# [1] 1