經常會有幾個函數嵌套或者連續賦值幾個臨時變量時代碼的可讀性會很差,而管道操作符則解決這個問題
例如嵌套函數f(g(h(x)))
管道操作符為
x %>%
h() %>%
g() %>%
f() %>%
同時更加符合處理發生的次序
一個稍復雜的例子
1.取10000個隨機數,符合正態分布。
2.求這個10000個數的絕對值,同時乘以50。
3.把結果組成一個100*100列的方陣。
4.計算方陣中每行的均值,並四舍五入保留到整數。
5.把結果除以7求余數,並畫出余數的直方圖。
不使用管道操作符的兩種代碼
1
# 設置隨機種子
> set.seed(1)
# 開始
> n1<-rnorm(10000) # 第1步
> n2<-abs(n1)*50 # 第2步
> n3<-matrix(n2,ncol = 100) # 第3步
> n4<-round(rowMeans(n3)) # 第4步
> hist(n4%%7) # 第5步
2
> set.seed(1)
> hist(round(rowMeans(matrix(abs(rnorm(10000))*50,ncol=100)))%%7)
管道操作符
# 設置隨機種子
> set.seed(1)
# 開始
> rnorm(10000) %>%
+ abs %>% `*` (50) %>%
+ matrix(ncol=100) %>%
+ rowMeans %>% round %>%
+ `%%`(7) %>% hist
%T%運算符
x %T% f()返回x本身而不是用f()修改后的返回值f(x), 這在中間步驟需要顯示或者繪圖但是需要進一步對輸入數據進行處理時有用。
%T>%左側的數據集或函數結果(A)作為右側程序(函數)的第一個參數調用,B(程序)函數的結果數據集不再向右側傳遞,而是把B左側的A數據集(或函數結果)再次向右傳遞給C函數(作為第一個參數調用),最后完成數據計算。
我們把上面的需求稍微進行調整,在最后增加一個要求,就會用到向左操作符。
1.取10000個隨機數符合,符合正態分布。
2.求這個10000個數的絕對值,同時乘以50。
3.把結果組成一個100*100列的方陣。
4.計算方陣中每行的均值,並四舍五入保留到整數。
5.把結果除以7求余數,並話出余數的直方圖。
6.對余數求和
由於輸出直方圖后,返回值為空,那么再繼續管道,就會把空值向右進行傳遞,這樣計算最后一步時就會出錯。這時我們需求的是,把除以7的余數向右傳遞給最后一步求和,那么就可以用到 %T>% 了
直接使用%>%向右傳值,出現異常。
> set.seed(1)
> rnorm(10000) %>%
+ abs %>% `*` (50) %>%
+ matrix(ncol=100) %>%
+ rowMeans %>% round %>%
+ `%%`(7) %>% hist %>% sum
Error in sum(.) : invalid 'type' (list) of argument
使用 %T>% 把左邊的值,再向右傳值,則結果正確。
> rnorm(10000) %>%
+ abs %>% `*` (50) %>%
+ matrix(ncol=100) %>%
+ rowMeans %>% round %>%
+ `%%`(7) %T>% hist %>% sum
[1] 328