2015-11-07 101 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 - 在「將名稱綁定到值」部分。 –

相關問題