管道操作符

2021-08-22 13:15:29 字數 3550 閱讀 9533

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重定向操作符 功能描述 將命令輸出寫入檔案或裝置,而不是命令提示符或控制代碼,清空原有檔案然後寫入 從檔案而不是從鍵盤或控制代碼讀入命令輸入 將命令輸出新增到檔案末尾而不刪除檔案中已有的資訊 與 比較使用 將乙個控制代碼的輸出寫入到另乙個控制代碼的輸入中 從乙個控制代碼讀取輸入並將其寫入到...