[英]How does R ggplot2 get the column names via aes?
我理解如何使用 aes,但我不理解程序化范例。
當我使用ggplot時,假設我有一個名為“animal”和“weight”的data.frame,我可以執行以下操作。
ggplot(df, aes(x=weight)) + facet_grid(~animal) + geom_histogram()
我不明白的是,重量和動物不應該是字符串,它們只是按原樣鍵入。 我怎么能這樣做? 它應該是這樣的:
ggplot(df, aes(x='weight')) + facet_grid('~animal') + geom_histogram()
我不會在任何地方“宣稱”體重或動物作為載體嗎? 這似乎......非常不尋常? 這是一個宏還是某些東西讓它變得“整體”,它會查看df的列名,然后填補它在aes中看到這些變量名稱的空白?
我想我想要的是在R中看到一些類似的函數,它可以獲取未在作用域中聲明的變量,以及該特性的名稱,因此我可以進一步閱讀並可能實現我自己的類似函數。
在R
這稱為非標准評估。 高級R書中有一章關於R中的非標准評估,可在線免費獲得。 基本上R可以查看調用堆棧以查看傳遞給函數的符號,而不僅僅是符號指向的值。 它在基礎R中使用了很多。它在tidyverse中以稍微不同的方式使用,它有一個叫做quosure的正式類,使這個東西更容易使用。
這些方法非常適合交互式編程。 它們可以保存擊鍵和雜亂,但是如果你創建的函數過於依賴於該函數,則它們很難編寫腳本或包含在其他函數中。
公式語法(帶有~
語法)可能是使用符號的最安全和更程序化的方法。 它捕獲的符號可以在data.frame的上下文中使用model.frame()
等函數進行后續評估。 還有內置函數來幫助操作update()
和reformulate
等公式。
由於你對aes()
調用明確感興趣,你可以通過鍵入沒有引號的名稱來獲取R中任何函數的源代碼。 使用ggplot2_2.2.1
,函數看起來像這樣
aes
# function (x, y, ...)
# {
# aes <- structure(as.list(match.call()[-1]), class = "uneval")
# rename_aes(aes)
# }
# <environment: namespace:ggplot2>
最新版本的ggplot使用不同的rlang
方法與其他tidyverse庫更加一致,因此它看起來有點不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.