R 調用 python
上一篇說了python使用 rpy2 調用 R,這裏介紹R如何調用python。R的強項在於統計方面,尤其是專業的統計分析,統計檢驗以及作圖功能十分強大,但是在通用性方面,就遠不如Python了,比如python可以做web,可以開發GUI,可以爬蟲,甚至可以開發遊戲,這些R其實也不是完全不行,但是在易用性方面實在是難以與Python相匹敵。所以如果要是能將R與Python相結合,充分發揮二者的優勢,那麽無疑我們會得到一個更加強大的武器。幸運的是,R 為我們提供了這麽一個工具,rPython。
rPython就是連接R與python的一個接口。其主頁地址在:http://rpython.r-forge.r-project.org/。按照其官網的介紹,rPython就是為了能夠彌補R在某些通用性領域的不足,使用python豐富的庫來彌補這些不足之處而誕生的。關於rPython如何工作,官網上寫的很清楚了:
How does rPython work?
One of the most daunting tasks in building an interface between two languages is provide mechanisms for exchanging different data structures between them. rPython uses json:
- R/Python objects are dumped into json strings using their respective parsers (RJSONIO and simplejson) respectively.
- These strings are passed between the two languages using their string exchange mechanisms.
- json strings are finally reconstructed into language objects on the other side.
This simple mechanism allow R and Python exchange relatively complex data structures with ease.
翻譯過來就是,連接R與python的一個麻煩之處在於這兩種語言的不同數據類型的以及對象的傳遞。rPython使用的解決辦法是通過json作為中間對象。即將python與R的數據以及對象先轉化為json字符串(python通過simplejson這個庫,R通過RJSONIO這個庫)進行傳遞,再轉化為相應語言的數據類型就可以了。
這裏需要特別提一下rPython在windows下的安裝方式。如果你使用的是linux或者mac系統,那麽安裝rPython是比較簡單的一件事情,直接使用命令install.packages("rPython")即可,但是坑爹的是,rPython在windows下沒有編譯好的包(以前如果我在windows下install.packages安裝失敗,就直接去CRAN官網找到相應的編譯好的包,然後解壓到R的library目錄下,就可以直接使用了),所以我們必須要自己編譯安裝了。最開始,我沒有找到合適的方法去安裝rPython,後來發現了rJython這個包,這個包在CRAN上有編譯好的,我成功安裝之後,發現也可以使用。額外提一句,通常我們說的Python指的是用C實現的python,即Cpython,但是還有其他語言實現的python,比如Jython就是Java實現的python,Ironpython是.Net和mono平臺上的python。pypy是使用純pyhton寫的python。對此有興趣的可以自行查閱資料。因為裝不上rPython,所以我只能使用Jython,使用Jython有利有弊,利當然就是可以無縫調用java一大堆的類庫了,弊就是Jython的第三方庫相比Cpython少的可憐,好多庫都不能用,所以這也是比較蛋疼的一件事情。
但是今天,我終於在github上面找到rPython在windows下的安裝方法了。鏈接在此:https://github.com/cjgb/rPython-win。大概安裝步驟如下:
1.下載github的zip文件
2.下載完成之後解壓,將文件夾重新命名為rPython
3.在R下安裝devtools(一個包管理工具,可以從github上面下載R包),install.packages("devtools")
4.library(devtools)
5.打開解壓之後的configure.win文件,大概長下面這個樣子:
#!/bin/sh
echo ‘PKG_LIBS=-LC:/python27/libs -lpython27‘ > src/makevars.win
echo ‘PKG_CFLAGS=-I"C:/Python27/include"‘ >> src/makevars.win
原來默認python的安裝位置為C:/python27,這裏需要將其改為你自己的電腦中python實際安裝的位置,以便於在編譯時可以正確找到python的安裝位置。
做好之後,執行命令:install("yourpath/rPython") ,引號中的內容是你解壓rPython的位置。至此,rPython就成功安裝了。如果安裝過程中報錯,比如我的就報錯,無法下載RJSONIO,請自行安裝相應的缺少的庫。
安裝成功之後,我們就來看看怎麽使用rPython吧。
其實rPython的使用還是比較簡單的,就提供了幾個調用的接口函數。直接看代碼實例吧:
1 # R 調用python 2 library(rPython) 3 python.call("len",1:10) # 調用函數 4 a <- 0:3 5 b <- 1:4 6 python.exec("def connact(a,b):return a+b") # 執行函數 7 c <- python.call("connact",a,b) # 調用函數 8 python.assign( "a", "hola hola" ) 9 a.split <- python.method.call( "a", "split", " " ) # 對a調用split函數,使用空格分割
首先加載rPython這個庫。
python.call("len",1:3)表示調用python的len函數對1:3這個向量進行計算,其實就是計算len([1,2,3]),答案當然是3了。python.exec()可以執行一段python代碼,這裏是執行了一個python函數,我們定義了兩個變量的相加,然後使用call調用這個函數,函數的兩個參數為a,b,計算結果為c。計算可以得到c的值為c(0,1,2,3,1,2,3,4)為一個向量,其實我們可以發現,R中的向量就對應了python中的列表。然後使用 python.assign()將字符串"hola hola" 賦值給變量a,然後對a調用split方法,split傳入參數為空格,即對a按空格進行分割,得到 結果為 "hola" "hola" 這兩個字符串。
其他還有一些方法的使用,大家可以自行參考CRAN上的函數幫助手冊,或者直接??rPython查看幫助文檔。
最後,來看如何在R中調用執行一個python文件。
名為 python_demo.py的文件如下:
# -*- coding:utf-8 -*- import requests ‘‘‘ 模擬登陸一個叫推酷的網站 ‘‘‘ s = requests.session() # data為要提交的數據,可以通過firefox的httpfox捕獲 data = { ‘email‘:‘[email protected]‘, ‘password‘:‘xxxxxxx‘, ‘authenticity_token‘:‘ANJyaQEi/IQqiFtLFu4md41p418qigNOzgIjJMwKz9A=‘, ‘remember‘:‘1‘ } url_login = ‘http://www.tuicool.com/login‘ # 要提交數據的地址 headers = {‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118Safari/537.36‘} res=s.post(url_login,data,headers = headers) r = s.get(url_login) content = r.content with open(‘tuiku.html‘,‘w‘) as f: f.write(content)
上面的代碼使用requests庫模擬登錄了某一個網站,將返回的內容寫入html文件。
只需要使用幾行代碼就可以從R調用執行這段python文件。
# 使用 rPython 調用 python文件 file_name = "F:/R_work/rPython/python_demo.py" python.load(file_name) # 調用python文件
在R中運行上面的代碼,幾秒之後,就會發現已經新增了一個html文件。怎麽樣,是不是很酷呢?
有了rPython之後,以後像數據抓取以及大規模運算等任務就可以交給python了,得到數據之後再傳入R,然後利用R的專業的統計包進行統計分析以及作圖等。python與R的無縫結合,so cool!
R 調用 python