【问题标题】:!!! (splice operator) for ggplot2 geom_point() function!!! ggplot2 geom_point() 函数的(拼接运算符)
【发布时间】:2022-01-09 02:35:30
【问题描述】:

我正在使用!!! (拼接运算符/大爆炸运算符)用于 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)

【问题讨论】:

  • 为了便于搜索,该运算符的正式名称现在为splice operator

标签: r ggplot2 rlang


【解决方案1】:

这些元编程运算符,包括 {{…}}!!!!! 仅适用于准引用函数。也就是说,其参数明确支持整洁评估的函数。通常,此类函数会在其文档中明确提及准引用支持。

这些函数中有ggplot2::aes,因为它通常对其参数使用非标准评估。但其他“ggplot2”函数(包括ggplot2::geom_point)对其参数执行标准评估,因此不支持任何这些伪运算符。

如果您想动态构造对该函数的调用,则需要走常规路线,例如通过(base R)do.call,或('rlang')exec(或手动,通过call + eval/call2 + eval_tidy)。

【讨论】:

  • 感谢您的解释。它真正阐明了为什么拼接运算符(!!!)仅适用于 ggplot2::aes. rlang::exec( "geom_point" , !!! params_lang ) 最终适用于我的情况!
【解决方案2】:

Konrad 出色地解释了函数失败的原因。我只想记下rlang::inject(),它允许您将准引用/非标准评估引入任何函数:

gg = gg + rlang::inject(ggplot2::geom_point( !!! params_lang ))

plot(gg)   # Now works

作为旁注,您的“这有效”示例实际上是对related question 的一个非常优雅的回答。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多