我在用 !!!(拼接運算子/大爆炸運算子)用于 ggplot2::geom_point() 函式,但它失敗了。有人能指出這段代碼有什么問題嗎?以下代碼嘗試從字符向量執行 ggplot2 函式。
library(rlang)
library(ggplot2)
data(mtcars)
data = mtcars
assoc = c( "cyl" , "hp" )
names(assoc) = c("x", "y")
assoc_lang = rlang::parse_exprs(assoc)
gg = ggplot2::ggplot(data, ggplot2::aes( ,, !!! assoc_lang )) # This works
params = c( "10", "\"black\"" )
names(params) = c("size", "colour" )
params_lang = rlang::parse_exprs(params)
gg = gg ggplot2::geom_point( !!! params_lang ) # This fails
plot(gg)
- 輸出
Error in !params_lang : invalid argument type
Calls: <Anonymous> -> layer
Execution halted
(注意)下面的代碼是一個等價的互動方式,它顯示了我想在上面的代碼中做什么。
library(ggplot2)
data(mtcars)
data = mtcars
gg = ggplot2::ggplot(data, ggplot2::aes( x = cyl , y = hp ))
gg = gg ggplot2::geom_point( size = 10, colour = "black")
plot(gg)
uj5u.com熱心網友回復:
這些元編程運算子,包括{{…}},!!并且!!!僅適用于準參考函式。也就是說,其引數明確支持整潔評估的函式。通常,此類函式會在其檔案中明確提及準參考支持。
在這些函式中是ggplot2::aes,因為它通常對其引數使用非標準求值。但是其他 'ggplot2' 函式(包括ggplot2::geom_point)對其引數執行標準評估,因此不支持任何這些偽運算子。
如果您想動態地構造對這個函式的呼叫,您需要走常規路線,例如通過 (base R)do.call或 ('rlang') exec(或手動通過call eval/ call2 eval_tidy)。
uj5u.com熱心網友回復:
Konrad 出色地解釋了該函式失敗的原因。我只想記下rlang::inject(),它允許您向任何函式引入準參考/非標準評估:
gg = gg rlang::inject(ggplot2::geom_point( !!! params_lang ))
plot(gg) # Now works
作為旁注,您的“This works”示例實際上是對相關問題的非常優雅的回答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/376605.html
上一篇:ggplot繪制網格
