今天想要研究一下R語言中含有百分號(hào)(%)符號(hào)的含義谬莹,之前沒系統(tǒng)歸納過,就借此機(jī)會(huì)好好做個(gè)筆記吧固以。
了解管道函數(shù)
使用R語言處理數(shù)據(jù)或者分析掂僵,很多時(shí)候免不了要寫連續(xù)輸入輸出的代碼,按照傳統(tǒng)書寫方式或者習(xí)慣昆码,初學(xué)者往往會(huì)引入一大堆中介變量气忠,或者使用函數(shù)嵌套進(jìn)行一次性輸出。
1赋咽、使用中介變量會(huì)使得內(nèi)存開銷成倍增長(zhǎng)旧噪,特別是你的原始數(shù)據(jù)量非常大而內(nèi)存又有限,在一個(gè)處理過程中引入太多中介對(duì)象脓匿,不僅代碼冗余淘钟,內(nèi)存也會(huì)迅速透支。
2陪毡、使用函數(shù)嵌套則避免了內(nèi)存占用的問題米母,但是嵌套太多層函數(shù)袱瓮,會(huì)造成代碼難以理解,閱讀困難爱咬,甚至給今后的項(xiàng)目復(fù)用造成很大的困擾尺借。
- 因此R中的大佬們也意識(shí)到這個(gè)問題,因此就引入了管道操作符函數(shù)精拟,進(jìn)行連續(xù)傳參燎斩,實(shí)現(xiàn)了內(nèi)存節(jié)省、代碼優(yōu)化的需求蜂绎。
- 通常我們使用最多的管道函數(shù)來自于magrittr包栅表,該包中管道操作函數(shù)寫作
%>%
,這是一個(gè)在R語言中使用非常頻繁的函數(shù),很多比較成熟的項(xiàng)目擴(kuò)展包都已經(jīng)實(shí)現(xiàn)了管道操作函數(shù)的內(nèi)置师枣。(比如dplyr怪瓶、rvest、leaflet等都實(shí)現(xiàn)了默認(rèn)調(diào)用)践美。
應(yīng)用管道函數(shù)
- %>%:表示將左邊的結(jié)果傳遞給右邊洗贰,通常右邊是一個(gè)函數(shù),它會(huì)對(duì)傳過來的結(jié)果進(jìn)行相對(duì)應(yīng)的計(jì)算陨倡。
> library(magrittr) #首先加載R包
> x1 %>% abs %>% sort %>% print
[1] 0.4099607 0.4564930 0.7520911 0.8002720 1.0047015 1.0146603
[7] 1.5045253 1.5460878 1.5702044 1.7963906
- 解釋:將x1的變量傳給abs函數(shù)敛滋,abs函數(shù)會(huì)給x1取絕對(duì)值,然后將絕對(duì)值后的結(jié)果傳給sort函數(shù)兴革,該函數(shù)對(duì)這個(gè)結(jié)果進(jìn)行排序绎晃,排完序之后會(huì)將結(jié)果傳遞給print函數(shù),這個(gè)函數(shù)會(huì)將最終結(jié)果打印顯示出來杂曲。
2.%<>%:與%>%類似庶艾,也是將左邊的結(jié)果傳遞給右邊的函數(shù)進(jìn)行計(jì)算,不同的是這個(gè)操作符會(huì)將最后的結(jié)果返回給最開始的變量擎勘。
> x2 %<>% abs %<>% sort %<>% print
[1] 0.4099607 0.4564930 0.7520911 0.8002720 1.0047015 1.0146603
[7] 1.5045253 1.5460878 1.5702044 1.7963906
- emmm咱揍,對(duì)的,目前看來這與上面的代碼結(jié)果十分一致货抄。
但是區(qū)別正是在于最開始的變量啦述召。
> x1
[1] 0.4099607 0.7520911 -1.0047015 -0.4564930 1.0146603
[6] 1.5045253 0.8002720 1.5460878 1.7963906 -1.5702044
> x2
[1] 0.4099607 0.4564930 0.7520911 0.8002720 1.0047015 1.0146603
[7] 1.5045253 1.5460878 1.5702044 1.7963906
- %>%操作符不會(huì)將結(jié)果傳遞給原始的x1變量,而%<>%操作符會(huì)在計(jì)算完成后蟹地,將結(jié)果傳遞給原始變量x2积暖。(可以仔細(xì)比對(duì)一下哦)
3.%T>%:會(huì)將左邊的結(jié)果傳遞給右邊進(jìn)行一些運(yùn)算,但不會(huì)返回運(yùn)算后結(jié)果怪与,只會(huì)返回原始的結(jié)果或者說上一級(jí)的結(jié)果夺刑。
> x3 %T>% abs %>% sort %>% print
[1] -1.5702044 -1.0047015 -0.4564930 0.4099607 0.7520911
[6] 0.8002720 1.0146603 1.5045253 1.5460878 1.7963906
- 從上述結(jié)果可以發(fā)現(xiàn),和x1、x2經(jīng)過管道傳送之后的結(jié)果實(shí)在是差別太大了吧遍愿。abs函數(shù)的結(jié)果并沒有傳遞到下一級(jí)函數(shù)中存淫,傳遞的仍是x3的結(jié)果感覺這個(gè)函數(shù)好像什么存在感都木有,但事實(shí)證明好像還真是這樣沼填。好吧桅咆。
4.%$%:該操作符的左邊通常不是一個(gè)變量,而是一個(gè)數(shù)據(jù)框或者列表坞笙,它可以將左邊的矩陣或者數(shù)據(jù)框傳遞到右邊的函數(shù)進(jìn)行運(yùn)算岩饼。
> data.frame(XX=x3) %$% ts.plot(XX)
- 左邊產(chǎn)生一個(gè)以XX為列名的數(shù)據(jù)框,傳遞到右邊畫圖函數(shù)薛夜,直接就可以讀出XX所代表的數(shù)據(jù)籍茧。是不是很像attach函數(shù)或者ggplot中作圖時(shí)的使用嘞。
5.%in%:該操作符的意思是匹配的含義梯澜,相當(dāng)于R中的 match函數(shù)寞冯,其表達(dá)的意思是左邊的元素在右邊的向量中是否存在,如果存在則返回TRUE晚伙,否則返回FALSE吮龄。
> c(1,2,3,4)%in%c(1:10)
[1] TRUE TRUE TRUE TRUE
> c(1:10)%in%c(1,2,3,4)
[1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
- 主要是記住哪個(gè)在左,哪個(gè)在右撬腾,相當(dāng)于將左邊的樣本與右邊的標(biāo)準(zhǔn)進(jìn)行匹配螟蝙。
上述幾個(gè)就是常用的恢恼,但管道函數(shù)可不只這些哦民傻,如果大家想了解得更深入可以利用R的help(%<%)
來獲取對(duì)應(yīng)函數(shù)的解釋文檔哦。