2016-02-11 54 views
10

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

此外,相切,你並不需要所有的進口。在你的例子中包括它們使得很難排除跨庫干擾。 –

+3

我編輯了你的問題,使用內置的數據而不是自己的數據,以消除未使用的包,並使整個事情複製/粘貼。 – Gregor

回答

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中+的使用早於管道,雖然用法相似,但功能卻非常不同。

作爲一個有趣的音符,哈德利威克姆(GGPLOT2的創造者)said that

...如果我發現的早管,也永遠不會一直是個GGPLOT2,因爲你可以寫ggplot圖形作爲

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

問題就變成了,爲什麼#3工作? – baptiste

+4

也許運算符的優先級有點小,看起來管道優先於ggplot的「+」方法。 – Gregor

+2

...似乎一般是真的:'10 + 1:2%>%sum()'給出13,其中'(10 + 1:2)%>%sum()'給出23. – Gregor

相關問題