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)
vs
aes(x=lon,fill=state)
vs
aes(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