ggplot2 plus 运算符是如何定义的?
Posted
技术标签:
【中文标题】ggplot2 plus 运算符是如何定义的?【英文标题】:How is ggplot2 plus operator defined? 【发布时间】:2017-03-19 22:53:38 【问题描述】:+
在提供数字以外的内容时通常会抛出 non-numeric argument to binary operator
。但它适用于 ggplot2,将绘图粘贴在一起。同时,它在 ggplot2 的上下文之外保留了其通常的功能(例如,作为算术或公式运算符),因此它的 ggplot2 版本与其中任何一个都不冲突。
我希望了解如何使+
以这种方式运行。浏览 ggplot2 github repo,我找到了 +.gg
和 %+%
的函数定义,但这并没有让我更清楚。
我会很高兴有一个指向 ggplot2 包中执行此操作的代码的指针,或者对如何完成此操作的一般解释。
【问题讨论】:
【参考方案1】:如果你剖析+.gg
,我们有:
> ggplot2:::`+.gg`
function (e1, e2)
e2name <- deparse(substitute(e2))
if (is.theme(e1))
add_theme(e1, e2, e2name)
else if (is.ggplot(e1))
add_ggplot(e1, e2, e2name)
此外,add_theme
,您感兴趣的是add_ggplot
,可以通过ggplot2:::add_ggplot
访问。后者 - 一个冗长但非常有条理的函数 - 揭示了更多“级联”函数来调度要添加的内容。
话虽如此,当在 gg
类的对象上使用“+”时,R“知道”要应用哪个函数(因为 S3 classes)。您可以在 ggplot2
GitHub 存储库中找到起点,在 ggproto.R
中,我认为大部分 ggplot2
行为都依赖于此。
这就是你要找的吗?
【讨论】:
谢谢。我不清楚的是函数的名称是+.gg
,但我们不使用+.gg
,我们使用简单的+
。如果发生这种情况,R 怎么知道打电话给+.gg
?
那是因为S3 classes。以及任何在 R 中的函数调用(尝试 +
(带引号)),ggplot2
“简单地”将 +
方法扩展到类 gg
的对象。
嗯,现在看到.
,这应该为我指明了正确的方向!你会碰巧知道 ggplot2 repo 中类的定义在哪里吗?
您是指gg
类还是+.gg
方法?
@chan1142 这是因为像+
这样的运算符只在具有实际“类”属性的对象上调度s3。没错,class("a")
返回"character"
,但如果你检查attributes("a")
,你会得到NULL。如果你定义例如a <- structure("a", class = "character")
并为b
做同样的事情,它会工作。请参阅stat.ethz.ch/pipermail/r-help/2006-May/104751.html 以及如何解决此问题:***.com/a/18175871/2416535以上是关于ggplot2 plus 运算符是如何定义的?的主要内容,如果未能解决你的问题,请参考以下文章