R(又稱R語言)是一款開源的跨平臺的數值統計和數值圖形化展示 工具。通俗點說,R是用來作統計和畫圖的。R擁有本身的腳本語言和大量的統計、圖形庫(得益於開源社區),這讓她看起來既美又實用。與其餘同類軟件(如 SPSS)相比,R的特色是純命令行的,這倒也好,咱們更應該把注意力放在數據自己,而非統計工具的UI。
R雖然說有一套本身的語言,還挺完備,但她最專業的仍是作統計和畫圖,而像鏈接數據庫、文本處理、文件操做等這些髒活可不能委屈R來幹哪,這些得有其 他語言來負責,個人選擇是咱最熟悉的、作這些髒活最棒的Python。那接下來的問題很清楚了,R和Python如何一塊兒工做?拍拍腦殼,想到可能有下面 幾種辦法:
1. R和Python只共享文件,Python把源數據處理乾淨,生成格式化的文件放在預約的目錄下,作個定時器讓R去讀文件,最終輸出統計結果和圖表。
這種作法必定程度上可行,除了作定時器外,還可讓Python即時執行」rscript」命令調用R腳原本工做,只是這種辦法限制太大,只可以交換文件,Python不能對R進行精確的控制。
2. 讓Python直接調用R的函數,R是開源項目,確定會有一些第三方庫實現Python與R互通。
果真,我找到了rpy2,能夠實現使用python讀取R的對象、調用R的方法以及Python與R數據結構轉換等。實際上除了Python,其餘語言與R互通的第三方包也大大的有。php
採用下面的命令進行安裝:
html
sudo pip install rpy2
最後我選擇第2種方法,來讓R與Python共舞。
模塊 rpy2.robjects 是rpy2對R的一個高級封裝,該模塊裏包含了一個r對象和一系列的R數據結構。使用rpy2的大多數狀況,只須要跟這個模塊打交道便可。rpy2的安裝 在此很少講了,有興趣的同窗看文檔去,直接體驗一下R如何與Python無縫整合吧。
瞭解r實例r實例是指rpy2.robjects.r,它是在Python中的嵌入式R進程,把r看成從python走向R的通道來看就能夠了。經過r實例,咱們能夠讀取R的內置變量、調用R的函數、甚至,直接把它看成R的解析器來用。
訪問R的對象在R的命令行中,咱們直接輸入對象名來訪問R的內置對象,如pi、letters:
在R控制檯中訪問R對象
而使用r實例,python訪問R對象也很簡單,並且方法不少:
在python中訪問R對象
在這段代碼中,咱們用了三種方式來訪問R對象,把r實例看成字典,把r實例看成方法,把r實例當 做一個類對象(真是神喻呀~)。在實際中,使用哪種方式要因習慣而異,我喜歡的方法是使用第三種,把r實例看成本身人,直接使用」.」來訪問R對象。但 這種方法有一個缺陷,就是不能訪問帶名字空間的R對象或函數,而其餘兩種方式是能夠的,這點將在隨後說明。
調用R函數經過r實例,咱們能夠輕易地實現用Python調用R的函數。下面咱們分別在R控制檯和python命令行下讀一個數據文件並畫一張點圖。
R控制檯讀取文件畫點圖
代碼解讀:
data.csv 的內容就是上面代碼的3到7的內容。
data = read.table(‘data.csv’) :把文件讀進一個數據框變量data中。
mtx = data.matrix(data):把data轉變成矩陣。
dotchart(mtx)用矩陣的數據畫點圖。
結果以下:
接下來用python來作一遍一樣的事情,咱們以前瞭解到,使用r實例能夠直接訪問R對象,還可 以直接調用R的函數,其實在Python看來,對象和函數是相同的東西,函數也是一種對象罷了。如今來試一下調用」read.table()」函數讀入一 個數據文件data.csv:
出錯了!怎麼回事?在上面我提到過了,使用「.」引用的方式不能訪問帶有名字空間的R對象和函數,read.table 是表示在read包下面的table函數,經過」.」的形式調用失敗,必需要用字典的方式或參數的方式來得到:
這段代碼獲得的結果與在R控制檯下畫點圖的效果是同樣的。最後一行 r.dotchart(mtx)是直接經過」.」來調用R的函數dotchart的,在沒有名實空間的狀況下,是正常的。若是你爲了不太多不可控制的出 錯機會,你能夠統一地使用字典的方式來訪問R對象和方法,這是最保險的方法,雖然我我的認爲看起來有點彆扭。
r實例就是一R控制檯其實r實例就是一個可交互的R控制檯,只不過交互對象是Python與R罷了,爲了證實r實例具備R控制檯的特性,來作個實驗,寫一串R腳本,做爲Python一個字符串變量的內容,把該字符串傳給r實例,而後把r實例看成方法來調用:
出來的結果這樣:
注意,把r實例看成控制檯,只可以經過r(r代碼)的方式來使用r實例,字典的方式行不通。
加載自定義函數在實際應用中,使用R語言來編寫本身的函數一樣是不可避免的,在R控制檯中,可使用 source(‘script_path’)的方法來加載自定 義R腳本。而在Python中使用本身義R腳本中的函數也一樣方便:使用r.source(‘script_path’)便可把自定義函數加載到全局環境 中,再使用r.自定義方法名就能夠實現調用,我就是這樣作的,在此再也不詳述,同窗們本身動手玩一下。
R Vector與Python list向量(Vector)是R的一個最重要的也是最經常使用的數據類型,能夠理解爲 一個二維數據,對應Python的list。在R控制檯中,聲明一個變 量:「x <- 1」,X會被聲明成一個向量,而其第一個值是1。R經常用c()函數來聲建立一個由多個值組成的向量,例如c(1,2,3,4)。Python要與R打交 道,除了訪問R對象和調用R函數,還有就是要學會如何轉換常見的數據類型。
rpy2提供了幾個類,供咱們把Python的list轉換成R的Vector。分別是 robjects.IntVector,robjects.Boolvector,robjects.StringVector,robjects.FloatVector. 以IntVector爲例,將Python的list轉換成R的Vector:robjects.IntVector([1,2,3,4,5]),畢!
下面來使用剛學到的類型轉換知識畫上一個例子的散點圖來結束這次體驗:
還在繼續…..rpy2提供的不只僅是上面這些,上面的知識只是rpy2所提供的20%,可是已經足以解決80%的問題。rpy2還提供了更低級的API,你能夠作更多的事情,例如你能夠實現另外一個robjects對象來支持使用」.」來訪問帶名字空間的對象和函數。更多的知識,請移步官方文檔。
python