问题 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()

5339
2018-02-11 04:40


起源

此外,切向,您不需要所有这些导入。在您的示例中包含它们使得很难排除交叉库干扰。 - Matthew Drury
我已经编辑了你的问题,使用内置数据而不是你自己的数据,以消除未使用的包,并使整个事件能够复制/粘贴。 - Gregor


答案:


管道是非常不同的 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()

但这一切都很好地解释了 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中,在管道之前,虽然用法类似,但功能却完全不同。

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

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

ggplot(mtcars, aes(wt, mpg)) %>%
  geom_point() %>%
  geom_smooth()

13
2018-02-11 08:00



问题变成了,为什么#3有效? - baptiste
也许运算符的优先级有点运气,似乎管道优先于ggplot + 方法。 - Gregor
......这似乎是正确的: 10 + 1:2 %>% sum() 给出13,在哪里 (10 + 1:2) %>% sum() 给出23。 - Gregor
在我仓促的评论中,我只是忽略了%>%over +的优先级,毕竟这并不奇怪 - baptiste
@AnthonyEbert一般没有。 ggplot(mtcars, aes(wt, mpg)) + geom_point() + geom_line() 工作,但 ggplot(mtcars, aes(wt, mpg)) + (geom_point() + geom_line()) 才不是。 - Gregor