2015-11-07 75 views
11

好吧,这有点奇怪。我正在回答一个关于geom_histogram的初学者的问题,并且OP使用反引号发布了一个示例。他忽略了添加数据以便我补充,然后找到了答案,甚至没有注意到反引号。但另一个(实际上更优雅)的答案没有反引号发布。它并没有真正的工作,但反引号的效果更好。ggplot中aes函数中反引号和引号之间的区别

但现在我感到困惑。我不明白为什么应该有所不同。即使ggplot列表几乎相同,只有ggplot$mapping元素是不同的,据我所知(好吧,这是一个biggie)。我已经搜索了一下,但我不知道发生了什么。

所以这里是代码:(在aes周围Log Number引号)

#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

(反引号中aes周围Log Number):

#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

+1

我不确定,但这可能会提供一些见解。尝试查看'aes(x =“lon”,fill = state)'vs'aes(x = lon,fill = state)'vs'aes(x = \'lon \',fill = state)的输出'用引号,你结束了一个角色,但没有引号或反引号,你最终会有一个符号。 – Jota

回答

11

回到蜱在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 
+1

优秀的答案。谢谢。 –

+0

我刚刚注意到,这里还包括哈德利的高级R书:http://adv-r.had.co.nz/Environments.html - 在“将名称绑定到值”部分。 –

相关问题