В чем разница между оператором "+" в ggplot2 и оператором "%>%" в magrittr?

В чем разница между оператором "+" в ggplot2 и оператором "%>%" в magrittr?

Мне сказали, что они одинаковые, но если мы рассмотрим следующий script.

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

Трубопровод сильно отличается от добавления 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 предшествует трубе, и, хотя использование аналогично, функциональность совсем другая.

Как интересная сторона, Хэдли Уикхэм (создатель ggplot2) сказал, что:

... если бы я раньше обнаружил канал, никогда не было бы ggplot2, потому что вы могли бы писать графику ggplot как

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