gpt4 book ai didi

r - ggplot中aes函数中反引号和引号之间的区别

转载 作者:行者123 更新时间:2023-12-04 01:00:04 25 4
gpt4 key购买 nike

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

但现在我很困惑。我不明白为什么应该有区别。甚至ggplot列表也几乎相同,只有ggplot$mapping就我所见,元素是不同的(好吧,这是一个大问题)。我用谷歌搜索过,但我没有看到发生了什么。

所以这里是代码:

(在 Log Number 周围引用 aes ):

#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)

yield :

enter image description here

但是 (在 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)

更正确地产生这个:

enter image description here

最佳答案

反引号是 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

但这并不意味着你应该。

说到 ggplot ,如果你这样做了
ggplot(mtcars, aes(x = wt, y = 1)) + geom_point()

你会期望所有的 y 值都是 1。你是对的!

对于带引号的字符串,它是一样的:
ggplot(mtcars, aes(x = wt, y = "mpg")) + geom_point()

除了代替 y = 1 中的数字在上面的情况下,您已经给了它一个字符 - 它被隐式转换为离散 y 尺度(只有一个值)的因子(只有一个级别)。是否有名为 "mpg" 的列并不重要与否,因为您刚刚通过 aes()一个值。 ggplot不查找名为 mpg 的列就像它不查找名为 1 的列一样在第一个例子中。

用回勾,你给 ggplot R 识别为对象名称的东西,而不仅仅是像 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()

虽然回滴答声 做工作 , 并在 aes() 中设置常量通常确实有效,这些都不推荐。设置常量的首选方法是 在外部设置常量 aes() .这是保证一切在更复杂的情节中都能很好地工作的唯一方法。特别是,如果您尝试在 aes() 中做一些奇怪的事情,方面通常会出错或不会产生预期的结果。 (尤其是转换)。
# 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.

对于非标准列名, 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()

一个更好的例子,开始看幕后,感谢@TheTime:

最终, ggplot需要评估所有内容,这将通过 eval 完成.请考虑以下事项:
a <- 1

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

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

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

关于r - ggplot中aes函数中反引号和引号之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33577519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com