R語言中的管道操作

2021-03-02 生信媛

這是R數據科學的讀書筆記之一,《R數據科學》是一本教你如何用R語言進行數據分析的書。即便我使用R語言快2年多了,但是讀這本書還是受益頗多。

(好吧,這兩年來我一直在舒適區原地踏步)

這一篇學習筆記對應第13章:使用magrittr進行管道操作。關於管道這個概念,我最早在Linux系統中接觸,它是Unix系統設計哲學的體現,「組合小功能完成大任務」,比如說BWA比對後排序用管道的寫法就是

bwa mem ref 1.fq 2.fq | samtools sort > align.bam

在R語言接觸管道符號"%>%"是在學習 dplyr包時候,那個時候我以為這個符號是 Hadley Wickham 創造出來的,其實是來源於Stefan Milton Bache開發的 magrittr中。

基礎部分

在沒有管道符號之前,如果我要對一個變量做一系列的分析的話,那麼寫法是下面這個樣子

# 先創建100個隨機數

nums <- rnorm(100)

# 分成兩列

nums_matrix <- matrix(nums, ncol = 2)

# 分別求兩列的均值

nums_mean <- Matrix::colMeans(nums_matrix)

這裡面我寫了很多中間變量,要多敲很多字,而且如果我要修改輸入的話的100個隨機數的話,我需要修改兩處。當然可以進行函數嵌套.

Matrix::colMeans(matrix(rnorm(100), ncol=2))

但是這種寫法不利於人的閱讀,當我讀到這個函數的時候,我需要先連續往大腦裡塞進去兩個函數後,才能抵達核心,然後再從裡往外解析。

但是有了管道符號之後一切就不一樣了,寫法就是

rnorm(100) %>% matrix(ncol=2) %>% Matrix::colMeans()

你會發現從左往右閱讀,代碼讀起來非常的流暢。

雖然管道看起來很美好,但是在如下的場景中就不太適合了,

簡單點說,就是類似於A > B > C > D 這種場景用管道比較好。

除了 %>%這個好用的符號外,magrittr還提供了其他三個比較好用的符號, %$%, %<>%和 %T>%。

高級部分

上面都是常規操作,作為有一定基礎的R語言使用者,更希望探索點這個符號的本質。

首先明確一點,在R語言中一切符號本質上都是函數,比如說"+"也是一個函數,常規用法都是 1+2, 但是我們可以用函數的方式來寫哦

`+`(4,5)

# 9

因此 rnorm(100)%>%matrix(ncol=2)其實應該理解成

`%>%`(rnorm(100), matrix(ncol=2))

那麼我們就可以看看管道符號的原始碼了

?magrittr::`%>%`

function (lhs, rhs)

{

   parent <- parent.frame()

   env <- new.env(parent = parent)

   chain_parts <- split_chain(match.call(), env = env)

   pipes <- chain_parts[["pipes"]]

   rhss <- chain_parts[["rhss"]]

   lhs <- chain_parts[["lhs"]]

   env[["_function_list"]] <- lapply(1:length(rhss), function(i) wrap_function(rhss[[i]],

       pipes[[i]], parent))

   env[["_fseq"]] <- `class<-`(eval(quote(function(value) freduce(value,

       `_function_list`)), env, env), c("fseq", "function"))

   env[["freduce"]] <- freduce

   if (is_placeholder(lhs)) {

       env[["_fseq"]]

   }

   else {

       env[["_lhs"]] <- eval(lhs, parent, parent)

       result <- withVisible(eval(quote(`_fseq`(`_lhs`)), env,

           env))

       if (is_compound_pipe(pipes[[1L]])) {

           eval(call("<-", lhs, result[["value"]]), parent,

               parent)

       }

       else {

           if (result[["visible"]])

               result[["value"]]

           else invisible(result[["value"]])

       }

   }

}

這個代碼的核心在於如下兩行

env[["_function_list"]] <- lapply(1:length(rhss), function(i) wrap_function(rhss[[i]],

       pipes[[i]], parent))

env[["_fseq"]] <- `class<-`(eval(quote(function(value) freduce(value,

       `_function_list`)), env, env), c("fseq", "function"))

這兩行幹的活其實是進行詞法轉換,也就是把我們之前的管道串聯起來的部分轉換成

my_pipe <- function(.){

   . <- rnorm(.)

   . <- matrix(., ncol = 2)

   . <- Matrix::colMeans(.)

}

my_pipe(100)

相關焦點

  • R語言必知必會之tidyverse(一):管道操作
    強烈建議大家,拋棄流傳甚廣的陳舊的數據操作方面的 R 語法,全面改用 tidyverse。——————————————————————————————下面先從第零篇,管道操作,開始。一. 簡介magrittr 包引入了管道操作,能夠通過管道將數據從一個函數傳給另一個函數,從而用若干函數構成的管線依次變換你的數據。
  • R語言高效的管道操作magrittr
    前言使用R語言進行數據處理是非常方便的,幾行代碼就可以完成很複雜的操作。但是,對於數據的連續處理,還是有人覺得代碼不好看,要麼是長長的函數嵌套調用,有點像Lisp感覺,括號包一切;要麼就是每次操作賦值一個臨時變量,囉嗦。為什麼就不能像Linux的管道一樣優雅呢?
  • R語言 | 數據操作dplyr包
    [更新~] Python網絡爬蟲與文本數據分析公眾號只帶著Python字眼,卻分享著R語言,不務正業,任性了~dplyr簡介dplyr是R語言的數據分析包,很像python中的pandas,能對dataframe
  • R 語言中常用的文件操作及字符串相關函數
    目前,談到 「R語言文件及路徑操作」,國內能夠搜索到的內容,基本上都是千篇一律,要麼是水文,搬運函數名和對應的功能,簡單羅列;要麼就異常豐富,直接把基礎函數裡所有相關的函數名全部羅列了出來。在這裡面,能夠追溯到較早的文章,在 2015 年左右,甚至更早。
  • 從另一個視角看 R 語言的方言 Tidyverse
    而 Tidy 則不然,需要更改成> library(dplyr)> thue2 <- thuesen %>% filter(blood.glucose < 7)老師首先要講授管道操作符 %>%,又一份額外的複雜性。
  • rPython:在R語言中調用python命令
    經常使用Python和R語言的人都知道,如果R中有某些功能Python不容易實現時,則可以安裝加載rpy2包,從而實現在python中調用R語言命令的功能
  • R語言從入門到精通:Day6-R語言數據操作進階及控制結構
    數據處理是R語言和數據挖掘的重要基礎,要求大家務必熟練操作,所以今天我們就從一個簡單的實例出發,給大家繼續講解數據處理進階及控制結構。1、本節內容重點內容較多,      務必緊跟紅色標記。2、測試數據及代碼      見文末客服小姐姐二維碼。
  • rpy2庫 | 在jupyter中調用R語言代碼
    那麼就會遇到今天的問題-如何在jupyter中使用R語言代碼?rpy2包rpy2包首先是Python包,ta銜接了Python和R,通過rpy2可以運行R語言相關代碼、函數、包。r_code)準備一個R代碼r_code,該代碼會生成R語言的tibble數據類型(R語言中的一種data frame)。
  • R語言學習指南(3) tidyverse的基礎使用
    tidyverse是為數據科學設計的R軟體包,它包含(ggplot2、dplyr、tidyr、stringr、magrittr、tibble)等一系列熱門軟體包,學好tidyverse的使用可也讓你站上另一個高度,從而高效的處理數據,因此本文檔不僅僅做一些案例介紹,而是希望以較為正確的學習方法來介紹R語言,使大家少走彎路,快速入門掌握R語言
  • R tips:使用{}自由的使用管道
    在R中可以使用magrittr包的%>%進行管道操作。管道操作可以減少中間變量的產生,並且使得多層嵌套的函數邏輯更加清晰。
  • R語言中編輯矩陣中元素的方法
    在實際數據處理過程中,我們有時需要對數據中的元素進行修改,或刪除矩陣中的某一行或某一列,甚至需要將兩個矩陣進行合併。本文將介紹在R語言中如何實現對矩陣元素的修改操作。修改矩陣元素的值以下的操作都是基於這樣的一個矩陣:m1 <- matrix(c(1:6), nrow=2, ncol=3, dimnames = list(c("r1", "r2"), c("c1", "c2", "c3")
  • R語言中使用subset函數對數據進行分類管理操作
    那麼,R語言是怎麼做出這樣的表格呢?首先我們要把數據進行分割,得到一個倖存的數據表和一個死亡的數據表,然後再分別統計,我們今天利用R語言自帶的subset函數來演示這一功能,這是一個非常重要的功能,為今後我們對數據進一步分析做準備。
  • 乾貨 掌握R語言中的apply函數族
    原因在於R的循環操作for和while,都是基於R語言本身來實現的,而向量操作是基於底層的C語言函數實現的,從性能上來看,就會有比較明顯的差距了。那麼如何使用C的函數來實現向量計算呢,就是要用到apply的家族函數,包括apply, sapply, tapply, mapply, lapply, rapply, vapply, eapply等。
  • 快速掌握R語言中類SQL資料庫操作技巧
    ,往往會遇到各種複雜的數據處理操作:分組、排序、過濾、轉置、填充、移動、合併、分裂、去重、找重、填充等操作。這(本章節為R語言入門第二部分總結篇:數據操作)本章內容布局思路:思來想後,想到SQL查詢的查詢思路可以作為本章節的布局思路2.對表中的一些數據做出修改、替換、甚至生成新欄位1.1 向量 Vector : c()1.2 矩陣 Matrix: matrix()1.3 數據框 DataFrame: data.frame()
  • R語言-stringr-字符串處理
    R包stringr處理字符相對簡單,尤其是我常用Power BI,但是對M語言不熟悉,不會處理字符數據,往往我就先利用R清洗字符數據列。本文記錄工作中常用的字符處理函數,部分案例照搬R for Data Science的字符部分。
  • C語言——文件的基本操作
    C語言基礎合集,點我點我~~~C語言進階合集,點我點我~~~C語言高級:01.C語言實現字符串的加密和解密02.C語言數據結構——鍊表C語言中文件的基本操作包括:文件的打開、文件的關閉以及文件的輸入和輸出。
  • R語言中plyr包
    文章轉載自哈爾濱商業大學銀河統計工作室前言  apply族函數是R語言中很有特色的一類函數,包括了apply、sapply、lapply、tapply
  • R語言對接高級語言Fortran
    (1)Fortran是當之無愧的性能之王,在本文的測試中可以看到Fortran代碼的效率是Rcpp的2倍、Julia的4倍、python的30倍、R語言的90倍。在for循環密集的代碼中,Fortran可以輕鬆達到R語言的200倍;(2)很多古老的、但專業上通用的模型採用Fortran語言編寫,翻譯成其他語言,人力所不能及。為何對接到R語言?
  • R語言從入門到精通:Day5-R語言數據操作示例及數據
    話不多說,我們進入這次課程的主要內容,上節課中完成了R語言中的數據導入工作,那麼這次課程的主要內容就是給大家介紹一些數據管理和操作的基本函數或語句。1、本節內容重點內容較多,      務必緊跟紅色標記。2、測試數據及代碼      見文末客服小姐姐二維碼。一般來說,創建新變量是項目中必不可少的步驟。
  • 什麼是R語言
    首先介紹一本學習R語言的書,《R語言實戰》。原作者是業內大名鼎鼎的Quick-R網站創始人Robert I.