我正在撰寫一個包,我的一個函式會生成一個 ggplot。我只想匯入 ggplot2 或 rlang (不依賴于它們)。經過一些試驗和錯誤后,我設法讓它作業,但現在我不確定它為什么作業。
所以我的問題是,為什么下面的代碼不直接訪問!!with就可以作業::?
arg1 <- "Species"
ggplot2::ggplot(iris, ggplot2::aes(x = Petal.Width, y = !!rlang::sym(arg1)))
ggplot2::geom_bar(stat = "summary", fun = "max")
我的理解是,為了訪問該!!功能,我應該用 指定包::,但是這個例子有效,所以我錯過了什么?
uj5u.com熱心網友回復:
它之所以有效,是因為 'rlang'/tidy 評估實際上并沒有決議!!運算子,它甚至沒有定義這樣的運算子——實際上這個運算子甚至不存在!它只是兩個鏈式!運算子,它們永遠不會被評估,因為整潔的評估使用非標準評估。'rlang' 中的實際實作是在 C 中,修復 R 運算子優先級規則中的不匹配是相當復雜的,但功能子集的簡化版本可能如下所示:
bang = as.name('!')
interpolate_bang_bang = function (expr, envir) {
if (is.call(expr) && expr[[1L]] == bang) {
if (is.call(expr[[2L]]) && expr[[2L]][[1L]] == bang) {
eval(expr[[2L]][[2L]], envir = envir)
} else {
expr
}
} else {
expr
}
}
這將測驗未計算的運算式是否完全正確!! ?something?,并將其替換為 的計算版本?something?。真正的實作更加復雜,因為它需要處理任意復雜的嵌套運算式(例如1 !!x),并且它還做了很多其他的事情。但基本事實如上所示:沒有!!運算子。相反,'rlang' 檢查未計算的運算式是否包含兩個立即嵌套的!運算子呼叫。
因此,即使您愿意,也無法匯入或附加!!操作員。
uj5u.com熱心網友回復:
如果rlang加載了包(或者甚至加載了 ggplot2 包),然后 usinghelp("!!")會彈出一個幫助頁面,將其命名為“注入運算子”,這表明 Konrad Rudolph 的答案是錯誤的,或者至少與 Hadley 的版本不同步NSE 用語。在對康拉德的回答的評論中給出的鏈接更有幫助:https ://adv-r.hadley.nz/quasiquotation.html#the-polite-fiction-of 。(Konrad 的錯誤將是一個非常不尋常的例子。)在 `help("topic-inject-out-of-context") 中也提到了那里所謂的“注入運算子”。
!!并且!!!在所有由 rlang 提供支持的參考函式中表現得特別,在這些函式中它們表現得像真正的運算子,其優先級等同于一元and-。
在當前實體中,您也可以使用 得到相同的結果"! ! ",我覺得這很奇怪,但由“禮貌小說”材料解釋。
我的懷疑是,呼叫的簡單行為ggplot2::ggplot會將一堆所需的包加載到可訪問的命名空間集中,即使您試圖通過使用“::”方法來防止這種情況發生。所以 ”!!” 盡管努力防止發生這種情況,但確實以 NSE 方式進行了評估:
#In an entirely base session with only required packages loaded ....
ggplot2::ggplot(iris, ggplot2::aes(x = Petal.Width))
#-----------------------------------
> sessionInfo()
R version 4.1.2 (2021-11-01)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.5 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] magrittr_2.0.2 tidyselect_1.1.2 munsell_0.5.0 colorspace_2.0-3 R6_2.5.1 rlang_1.0.2
[7] fansi_1.0.2 dplyr_1.0.8 tools_4.1.2 grid_4.1.2 gtable_0.3.0 utf8_1.2.2
[13] cli_3.2.0 DBI_1.1.2 ellipsis_0.3.2 assertthat_0.2.1 digest_0.6.29 tibble_3.1.6
[19] lifecycle_1.0.1 crayon_1.5.0 purrr_0.3.4 ggplot2_3.3.5 vctrs_0.3.8 glue_1.6.2
[25] labeling_0.4.2 compiler_4.1.2 pillar_1.7.0 generics_0.1.2 scales_1.1.1 pkgconfig_2.0.3
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/450737.html
上一篇:在一個資料框列中使用多個時區
