1. 程式人生 > >R 調用 python

R 調用 python

比較 ons 類庫 app 表示 開發 task 發現 傳遞

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