14

"+"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()
4

1 回答 1

17

管道与 的添加非常不同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()
于 2016-02-11T08:00:03.240 回答