r語言處理資料或分析時,很多時候要寫連續輸入輸出**,傳統書寫方式會引入一大堆中介變數,或者使用函式巢狀進行一次性輸出。以上兩種方法雖然從結果來看可以達到預期效果,但是無論是**效率還是記憶體占用都存在巨大劣勢
1.中介變數會使得記憶體開銷成倍增長,特別是原始資料量非常大而記憶體有限,在處理過程中引入太多中介物件,不僅**冗餘記憶體也會迅速透支
2.函式巢狀則避免了記憶體占用問題,但是巢狀太多層函式,會造成**難以理解,閱讀困難,甚至給今後的專案復用造成很大的困擾
r引入管道操作符函式,進行連續傳參,實現了記憶體節省、**優化的需求。通常使用最多的管道函式來自於magrittr包,該包中管道操作函式%>%在r中使用非常頻繁,很多比較成熟的專案擴充套件包都已經實現了管道操作函式的內建(比如dplyr、rvest、leaflet等都實現了預設呼叫)
library("rvest")
library("stringr")
url<-""
#讀取url所在的目標網頁
name<-read_html(url,encoding="gbk") %>%
#選擇b節點內容
html_nodes("b") %>%
#獲取b節點內的文字(清除空格)
html_text(trim=false) %>%
#替換掉文字內的所有製表符\標點符號等,使用gsub函式
gsub("(\\n\\t|,|\\d|、)","",.) %>%
#篩選出非空文字
grep("\\s",.,value=t) %>%
#清除掉文字兩側的空格
str_trim(side="both") %>%
#保留字串向量的1:54個觀測值
.[1:54]%>%
#剔除掉其中的第35、39個觀測值
.[setdiff(1:54,c(35,39))]
#以上**使用管道操作函式依次將左側獨享作為引數傳入右側函式內部,層層傳遞,不建立任何中間變數,因而這一段**自url輸入起始,到setdiff篩選完畢之後輸出name終止,沒有生成任何中間變數-意味著沒有浪費任何多餘記憶體.從**的簡介與優雅程度來看,它也完勝前兩者,因為每一句功能都可以通過%>%看到明顯的輸入輸出,當你回看或者修改時,僅需定位到對應**塊除錯即可
關於引數傳遞的細節:
1.當函式僅需乙個必要引數時,則此時函式寫法容忍度非常高,相對自由:
sample(letters[1:5],size=20,replace=true) %>% table()
sample(letters[1:5],size=20,replace=true) %>% table
sample(letters[1:5],size=20,replace=true) %>% table(.)
a b c d
5 7 1 7
以上三種寫法都可以輸出正確的結果,第一種寫法保留了括號,第二種寫法省略了括號,第三種同時保留了括號和佔位符「.」
因為table只接受乙個位置引數(也可以理解為必備引數,該引數是乙個因子或者類別型變數)從左側由管道操作符傳入的引數就會被作為table的必備引數.前兩種寫法等價,第三種寫法在括號內加入了佔位符
2.當函式有乙個以上的必備引數時,而且管道函式傳入的引數位於第乙個時,可以寫成如下模式:
url %>% read_html(encoding="gbk")
url %>% read_html(.,encoding="gbk")
read_html函式中僅有乙個位置引數x(必備引數),encoding是乙個預設引數,options也是乙個預設可選引數.因而x是必備引數,且無需宣告引數名稱.url被%>%傳入read_html之後,預設就被作為x引數的物件.以上兩種寫法等價,第二種寫法宣告了x引數在read_html()函式內的位置(相當於x引數的佔位符)但是在此種情況下並不必要(因為x作為第乙個位置引數,可以被預設識別出來)
3.當函式有不止乙個位置引數(必備引數)時,且左側傳入物件在右側函式中不是位置排在第乙個,那麼此種情況下必須顯式宣告該引數在右側函式中所處的位置,並且使用.作為佔位符佔位
read_html(url,encoding="gbk") %>% html_nodes("b") %>% html_text(trim = false) %>% gsub("(\\n\\t|,|\\d|、)","",.)
#magrittr包為了保證管道函式傳參過程更為高效,提供了很多類似%>%的輔助函式:
#以下函式中有經常用到的四則運算、邏輯判斷與比較函式、包含關係函式等,也有一些使用頻率不高的冷門函式
函式名稱: 函式符號表示式:
extract "[" #用於索引資料框中的列
extract2 "[[" #索引列表中的順序物件
inset "[<-"
inset2 "[[<-"
use_series "$"
add "+"
subtract "-"
multiply_by "*"
raise_to_power "^"
multiply_by_matrix "%*%"
divide_by "/"
divide_by_int "%/%"
mod "%%"
is_in "%in%"
and "&"
or "|"
equals "=="
is_greater_than ">"
is_weakly_greater_than ">="
is_less_than "<"
is_weakly_less_than "<="
not ("n'est pas") "!"
set_colnames "colnames<-"
set_rownames "rownames<-"
set_names "names<-"
例子:#以下等價
iris %>% extract(,1:3) %>% head
iris %>%"["(1:3) %>% head
iris %>% .[,1:3] %>% head
Rxjs常用的管道操作符
mep 類似於 array.prototype.map switchmap switchmap 會停止發出先前發出的內部 observable 並開始發出新的內部 observable 的值。可以停止上一次發出的ajax mergemap 將每個值對映到observable,必須返回乙個observ...
5 7 操作符和 Async 管道
rxjs的精彩之處是它可以有一些操作符。它有非常強大的操作符。它不僅僅限於這個表達形式 filter是用來過濾的。然後再用map獲取到tablinkk這個引數。它有一組引數,但是我們只關心 tablink.這個流當中本來是一組引數,我只得到tablink這乙個引數 批量把param改名字。按住f2同...
Linux中各種操作符 重定向操作符 管道符
linux重定向操作符 功能描述 將命令輸出寫入檔案或裝置,而不是命令提示符或控制代碼,清空原有檔案然後寫入 從檔案而不是從鍵盤或控制代碼讀入命令輸入 將命令輸出新增到檔案末尾而不刪除檔案中已有的資訊 與 比較使用 將乙個控制代碼的輸出寫入到另乙個控制代碼的輸入中 從乙個控制代碼讀取輸入並將其寫入到...