ggplot中的反引号和引号中的引号之间的区别

Mik*_*ise 12 r ggplot2

好吧,这有点奇怪.我正在为一个初学者回答一个问题geom_histogram,OP发布了一个使用反引号的例子.他忽略了添加数据,所以我做了,然后找到了答案,甚至没有注意到反引号.但另一个(实际上更优雅)的答案是在没有反引号的情况下发布的.它并没有真正起作用,但它与反引号相比效果更好.

但现在我很困惑.我不明白为什么应该有所不同.即使ggplot列表几乎相同,只有ggplot$mapping元素是不同的,我可以看到(好吧,这是一个大问题).我google了,但我不知道发生了什么.

所以这是代码:

(引号Log Numberaes):

#Generate some data
lon <- log(rnorm(1000, exp(6)))
state <- sample(c("c", "l", "t"), 1000, replace = T)
d <- data.frame(lon, state)
names(d) <- c("Log Number", "state")

# Plot it
gpsq <- ggplot(d, aes(x = 'Log Number', fill = state)) + geom_histogram()
print(gpsq)
Run Code Online (Sandbox Code Playgroud)

得出这个:

在此输入图像描述

但是这个(反引号周围Log Numberaes):

#Generate some data
lon <- log(rnorm(1000, exp(6)))
state <- sample(c("c", "l", "t"), 1000, replace = T)
d <- data.frame(lon, state)
names(d) <- c("Log Number", "state")

# Plot it
gpsq <- ggplot(d, aes(x = `Log Number`, fill = state)) + geom_histogram()
print(gpsq)
Run Code Online (Sandbox Code Playgroud)

更正确地得出这个:

在此输入图像描述

Gre*_*gor 12

返回刻度是在R中表示非标准变量名称的标准方式.引号用于表示字符串.例:

`bad name` = 1
`bad name`
# [1] 1
Run Code Online (Sandbox Code Playgroud)

这不适用于引号.

"bad name" = 1
"bad name"
# [1] "bad name"
Run Code Online (Sandbox Code Playgroud)

通常,您不应使用这些奇怪的非标准名称.但是,如果你不得不这样做,那就是这样做的.你几乎可以做任何事,

`really-bad^name+violating*all()/[kinds] <- of == rules&!|` = 1
# works just fine
Run Code Online (Sandbox Code Playgroud)

但这并不意味着你应该这样做.


当涉及到ggplot,如果你这样做

ggplot(mtcars, aes(x = wt, y = 1)) + geom_point()
Run Code Online (Sandbox Code Playgroud)

你会期望所有的y值都是1.而且你是对的!

使用带引号的字符串就是一样的:

ggplot(mtcars, aes(x = wt, y = "mpg")) + geom_point()
Run Code Online (Sandbox Code Playgroud)

除了y = 1上面的情况中的数字,你已经给它一个字符 - 它隐含地转换为一个因子(只有一个级别)的离散y标度(只有一个值).如果有一个名为"mpg"或不是的列,则无关紧要,因为您刚刚传递aes()了一个值.ggplot不会查找名称mpg相似的列,也不会查找1第一个示例中指定的列.

使用后退滴答,您可以将ggplotR识别为对象名称,而不仅仅是像1或者"some string".所以ggplot 不会去寻找与该名称的列.

# both of these work
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
ggplot(mtcars, aes(x = wt, y = `mpg`)) + geom_point()
Run Code Online (Sandbox Code Playgroud)

虽然返回标记确实有用,并且设置常量aes()通常可以正常工作,但这些都不是非常推荐的.设置常量的首选方法是在外部设置常量aes().这是保证一切都能在更复杂的情节中很好地工作的唯一方法.特别是,如果您尝试在内部进行奇怪的操作aes()(特别是转换),Facets通常会出错或者不会产生预期的结果.

# 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.
Run Code Online (Sandbox Code Playgroud)

对于非标准列名称,aes_string()效果很好,然后它期望美学映射被引用列名称.如果您正在编写一个创建ggplots并需要将列名作为参数的函数,这也是一种很好的方法.

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()
Run Code Online (Sandbox Code Playgroud)

一个更好的例子,开始看看引擎盖下,感谢@TheTime:

最终,ggplot需要评估一切,这将完成eval.考虑以下:

a <- 1

eval(parse(text="a"))
# [1] 1

eval(parse(text='"a"'))
# [1] "a"

eval(parse(text="`a`"))
# [1] 1
Run Code Online (Sandbox Code Playgroud)