R呼叫python

lyrichu發表於2017-05-07

  上一篇說了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:

  1. R/Python objects are dumped into json strings using their respective parsers (RJSONIO and simplejson) respectively.
  2. These strings are passed between the two languages using their string exchange mechanisms.
  3. 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(不再維護)


相關文章