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`:`xxxxx@qq.com`, `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!
熱愛程式設計,熱愛機器學習!
github:http://www.github.com/Lyrichu
github blog:http://Lyrichu.github.io
個人部落格站點:http://www.movieb2b.com(不再維護)
相關文章
- R呼叫python模組Python
- Java呼叫R與PythonJavaPython
- Java-呼叫R語言和呼叫Python(前後端展示)JavaR語言Python後端
- Nodejs 呼叫 R 指令碼 / Nodejs Call R ScriptNodeJS指令碼
- python中呼叫R語言通過rpy2 進行互動安裝配置詳解(R_USER、R_HOME配置)PythonR語言
- python 呼叫 webdriverPythonWeb
- Golang呼叫PythonGolangPython
- C#呼叫PythonC#Python
- python呼叫matlabPythonMatlab
- Python呼叫shell命令Python
- matlab呼叫pythonMatlabPython
- python ChainMap的呼叫效率PythonAI
- java呼叫python程式碼JavaPython
- Python 呼叫py檔案Python
- Python字串中的r和uPython字串
- Python呼叫C/C++方式PythonC++
- C# 呼叫Python程式碼C#Python
- C#/.net程式呼叫pythonC#Python
- Python呼叫MySQL模組初試PythonMySql
- linux下python 模組呼叫LinuxPython
- 使用python呼叫新浪微博介面Python
- C#呼叫python的方法C#Python
- Python真的勒死R語言了嗎?PythonR語言
- python和r語言的區別PythonR語言
- R1-001 初識PythonPython
- Python中%r和%s的區別Python
- python—呼叫API人臉識別PythonAPI
- Python 非同步呼叫命令列工具Python非同步命令列
- Python呼叫C模組以及效能分析Python
- 使用PyO3從Python呼叫 Rust:加速PythonPythonRust
- Python和R哪個更適合機器學習?Python機器學習
- python3去除str中的n、rPython
- python爬蟲呼叫谷歌翻譯介面Python爬蟲谷歌
- python中getattr如何帶引數呼叫?Python
- 如何呼叫python中的shell指令碼?Python指令碼
- python和c++的相互呼叫教程PythonC++
- Python與C/C++呼叫之ctypesPythonC++
- Python呼叫C++編寫的方法PythonC++