我想在 R 中撰寫一個函式來制作一些圖表,并且可以選擇通過用戶輸入的任何列來分面這些圖表。我更喜歡使用非標準評估來執行此操作,因為我不知道用戶將在他們輸入的 data.frame 中擁有哪些列。下面的代碼有效,用戶可以通過以下方式指定他們想要為點著色的列:
library(tidyverse)
library(rlang)
data("diamonds")
myplot <- function(DF, colorBy){
colorBy <- rlang::enquo(colorBy)
ggplot(DF, aes(x = price, y = carat, color = !!colorBy))
geom_point()
}
myplot(diamonds, colorBy = cut)

但是這段代碼,我試圖允許用戶指定一個列來分面,失敗了:
myplot_facet <- function(DF, colorBy, facetBy){
colorBy <- rlang::enquo(colorBy)
facetBy <- rlang::enquo(facetBy)
ggplot(DF, aes(x = price, y = carat, color = !!colorBy))
geom_point()
facet_wrap(. ~ !!facetBy)
}
myplot_facet(diamonds, colorBy = cut, facetBy = color)
我得到的錯誤是
錯誤:Quosures 只能在 quasiquotation 背景關系中不被參考。
# 不好:list(!!myquosure)
# 好:dplyr::mutate(data, !!myquosure)
我不確定如何使用該錯誤訊息來解決我的問題。是否facet_wrap有不同的輸入要求aes?我認為他們都使用整潔的語法呼叫 data.frame 中的列,所以我認為他們會以類似的方式作業。
作為更復雜的情況,如果用戶facetBy不想要構面,我希望用戶可以設定為 NA 。
我一直在嘗試閱讀類似的問題(here、here和here),并且我試圖從“Advanced R”中解讀NSE 章節,但我很掙扎。的其他問題都不是很我在問什么,并從“先進R”的NSE章我是無法理解。
uj5u.com熱心網友回復:
這有效:
myplot_facet <- function(DF, colorBy, facetBy){
facetBy <- enquo(facetBy)
ggplot(DF, aes(x = price, y = carat, color = {{colorBy}} ))
geom_point()
facet_wrap(vars(!!facetBy))
}
myplot_facet(diamonds, colorBy = cut, facetBy = color)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/417422.html
標籤:
