" +"有什么区别? ggplot2中的运算符和"%>%"操作员在magrittr?

时间:2016-02-11 04:40:36

标签: r ggplot2 magrittr

ggplot2中的"+"运算符与magrittr中的"%>%"运算符之间有什么区别?

我被告知它们是相同的,但是如果我们考虑以下脚本。

library(magrittr)
library(ggplot2)

# 1. This works
ggplot(data = mtcars, aes(x=wt, y = mpg)) + geom_point()

# 2. This works
ggplot(data = mtcars) + aes(x=wt, y = mpg) + geom_point()

# 3. This works
ggplot(data = mtcars) + aes(x=wt, y = mpg) %>% geom_point()

# 4. But this doesn't
ggplot(data = mtcars) %>% aes(x=wt, y = mpg) %>% geom_point()

1 个答案:

答案 0 :(得分:13)

管道与ggplot2的添加非常不同。管道运算符%>%所做的是获取左侧的结果并将其作为右侧的函数的第一个参数。例如:

1:10 %>% mean()
# [1] 5.5

完全等同于mean(1:10)。管道对于替换多重嵌套函数更有用,例如

x = factor(2008:2012)
x_num = as.numeric(as.character(x))
# could be rewritten to read from left-to-right as
x_num = x %>% as.character() %>% as.numeric()

但是这一切都在What does %>% mean in R?上得到了很好的解释,你应该仔细阅读更多的例子。

使用这些知识,我们可以将管道示例重新编写为嵌套函数,并看到它们仍然执行相同的操作;但现在它(希望)很明显为什么#4不起作用:

# 3. This is acceptable ggplot2 syntax
ggplot(data = mtcars) + geom_point(aes(x=wt, y = mpg))

# 4. This is not
geom_point(aes(ggplot(data = mtcars), x=wt, y = mpg))

ggplot2包含"+"ggplot对象的特殊aes()方法,用于向图表添加图层。我不知道,直到你问你的问题,它也适用于ggplot2函数,但显然也是定义的。这些都是+内特别定义的。在ggplot2中使用ggplot(mtcars, aes(wt, mpg)) %>% geom_point() %>% geom_smooth() 早于管道,虽然用法类似,但功能却完全不同。

作为一个有趣的旁注,Hadley Wickham(ggplot2的创建者)said that

  

...如果我早些时候发现了这个管道,就不会有ggplot2了,因为你可以把ggplot图形写成

case class CertFile(name: String, path: String, extension: String)

case class Certificate(certType: String, certFile: CertFile)


implicit val certFile: Reads[CertFile] = (
    (JsPath \ "name").read[String] and
      (JsPath \ "path").read[String] and
      (JsPath \ "extension").read[String]
    ) (CertFile.apply _)

  implicit val cert: Reads[Certificate] = (
    (JsPath \ "type").read[String] and
      (JsPath \ "file").read[CertFile]
    ) (Certificate.apply _)