簡體   English   中英

R ggplot2如何通過aes獲取列名?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM