我最近开始使用 R,并且对我的班级正在使用的 ggplot 感到困惑。我习惯了+运算符只添加两个输出,但我发现在 ggplot 中你可以执行以下操作:
ggplot(data = bechdel, aes(x = domgross_2013)) +
geom_histogram(bins = 10, color="purple", fill="white") +
labs(title = "Domestic Growth of Movies", x = " Domestic Growth")
Run Code Online (Sandbox Code Playgroud)
这里我们将两个函数调用添加在一起。这里到底发生了什么?ggplot 是否“重写”+运算符(也许就像如何重写==dart 中的运算符?)以便做一些不同的事情?或者“+”运算符在 R 中的含义与我在其他编程语言中习惯的含义不同?
我来回答第一个问题。您应该在单独的帖子中提出第二个问题。
R 允许您覆盖大多数运算符。最简单的方法是使用“S3”对象系统。这是一个非常简单的系统,您可以将一个指定的属性附加"class"到对象上,这会影响 R 处理某些函数的方式。(这适用于称为“泛型函数”。还有其他函数不关注类。)
每个ggplot2函数返回一个带有类的对象。您可以使用该class()函数来获取类。例如,class(ggplot(data = "mtcars"))是包含 的字符向量c("gg", "ggplot"),class(geom_histogram(bins = 10, color="purple", fill="white"))是向量c("LayerInstance","Layer","ggproto","gg")。
如果您要求,methods("+")您将看到所有定义了加法方法的类,其中包括"gg",因此 R 将调用该方法来处理您使用的表达式中的加法。