您好,登錄后才能下訂單哦!
小編給大家分享一下python中調用R函數的方法是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
如何在python中調用R?這其中包括了如何調用R的對象(函數和包),R和python的對象如何互相轉換,以及如何調用R的腳本(外界參數的輸入)。python提供了一個模塊rpy2,可以較好地完成這項工作。
一、安裝rpy2
rpy2的網址:http://rpy.sourceforge.net/index.html
可以使用easy_install安裝,# easy_install rpy2
注意事項:
(1)如果是源代碼編譯安裝R,需要在configure步驟加入后綴 --enable-R-shlib。
(2)需要安裝python-devel包。
二、python調用R對象
1、使用rpy2.robjects包的r對象
調用方法如下,以下robject.r的調用方法實際上是開啟了一個R的交互進程,只需要將R的代碼寫入一個字符串內(注1),接著調用R即可:
import rpy2.robjects as robjects
此時,有三種方法調用R對象:
第一種:robjects.r['pi']
第二種:robjects.r('pi')(這種方法從某種程度上講是萬能的,因為可以將任意大小和長度的R代碼寫成一個python字符串,之后通過robjects.r('Rcode')調用執行。)
第三種:robjects.r.pi(這種方法對于名稱中有“點號”的變量會出問題,比如data.frame/read.csv等,所以推薦使用第一種方法)
以下是一個創建和使用R函數(自己創建的函數或者R內置函數)。注意:最后一種方法,對于對付一些特殊的格式很管用:
# creat an R function >>> robjects.r( ''' f <- function(r){pi * r} . ''' ) >>> robjects.r['f'](3) [9.424778] # internal function in R >>> robjects.r['ls']() # another internal function >>> l = robjects.r['letters'] >>> len(l) >>> robjects.r['paste'](l, collapse = '-') # an alternative way of getting 'paste' function in R # eval the R code >>> coder = 'paste(%s, collapse = "-")' % (l.r_repr()) >>> robjects.r(coder)
對于一些特殊的R對象比如list和matrix,如果python要調去其中的部分數據,可以通過其rx()和rx2()方法操作。對于list,可以查看其name屬性,以獲得列表個個元素名稱。rx()和相當于"["操作(注意取出的是R的list對象),而rx2()相當于"[["操作。一個例子:
>>> tmp = r("list(a = matrix(1:10, nrow = 2), b = 'Hello')") >>> print tmp $a [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 $b [1] "Hello" >>> tmp.names <StrVector - Python:0x8afdc8c / R:0x8ce0a70> ['a', 'b'] >>> tmp.rx('a') <ListVector - Python:0x8afd86c / R:0x8cf71c0> [Matrix] a: <class 'rpy2.robjects.vectors.Matrix'> <Matrix - Python:0x8b013cc / R:0x97de388> [ 1, 2, 3, ..., 8, 9, 10] >>> tmp.rx(1) <ListVector - Python:0x8b010cc / R:0x8cf7100> [Matrix] a: <class 'rpy2.robjects.vectors.Matrix'> <Matrix - Python:0x8b017cc / R:0x97de388> [ 1, 2, 3, ..., 8, 9, 10] >>> tmp.rx2(1) <Matrix - Python:0x8b01b4c / R:0x97de388> [ 1, 2, 3, ..., 8, 9, 10] >>> tmp.rx2('a').rx(1, 1) # first element of 'a' <IntVector - Python:0x8b01acc / R:0x8cf6fa0> [ 1] >>> tmp.rx2('a').rx(1, True) # first row of 'a' <IntVector - Python:0x8b01f2c / R:0x965ffd8> [ 1, 3, 5, 7, 9]
注意事項:
如果函數有警告(warnings),在ipython等IDE上能夠執行,但是如果是腳本或者與網頁服務器交互,則會產生錯誤。
解決辦法:
(1)魯莽的解決很簡單,強行忽略R的警告,options(warn = -1)或者R代碼放入函數中suppressWarnings()。
(2)第二種辦法,如果是自己代碼中使用了warning()函數,則將warning信息換成字符串,之后單獨輸出。
如果R的函數參數用到向量,有兩種解決辦法:
(1)使用robject.**Vector()函數(見下)先將python對象轉換成R對象,然后帶入函數;
(2)直接使用python對象,一個例子:
>>> from rpy2.robjects import r >>> a = r['matrix'](range(10), nrow = 2) >>> print a [,1] [,2] [,3] [,4] [,5] [1,] 0 2 4 6 8 [2,] 1 3 5 7 9
2、python對象轉換成R對象
通常,可以將python的list對象,轉換成為R的vector對象,之后直接使用R函數調用。相應的函數是robjects.StrVector()/robjects.IntVector()/robjects.FloatVector()/robjects.complexVector()/robjects.FactorVector()/robjects.BoolVector()/,這些函數將python列表轉化成R的字符/整數/浮點/復數/因子/布爾向量。robjects.ListVector()將python的字典轉換成R的列表。
具體轉換可見http://rpy.sourceforge.net/rpy2/doc-2.2/html/vector.html#creating-vectors
比如:
>>> testmatrix = robjects.IntVector([1, 2, 3, 4]) >>> robjects.r['matrix'](testmatrix, nrow = 2) # another dynamic arguments example >>> x = robjects.IntVector(range(10)) >>> y = robjects.r.rnorm(10) >>> kwargs = {'ylab': 'foo/bar', 'type': 'b', 'col': 'blue', 'log': 'x'} >>> robjects.r.plot(*args, **kwargs) >>>
注意事項:
使用vector系列函數時,輸入的只能是python的列表,而不能是數字或者字符串。
3、載入和使用R包
使用rpy2.robjects.packages.importr對象,調用方法是
>>> from rpy2.robjects.packages import importr >>> base = importr('base') >>> stats = importr('stats') >>> affy = importr('affy') >>> stats.rnorm(10) 如果想引用一個包中的隱變量,也很簡單,只要載入包,然后所有r命令化成成字符串,之后引用即可(這種方法是萬能的),比如 >>> from rpy2.robjects.packages import importr >>> importr('hwriter') >>> a = r('hwriter:::hwrite.table(matrix(1:10, 2))') >>> print(a) [1] "<table border="1">n<tr>n<td>1</td><td>3</td><td>5</td><td>7</td><td>9</td></tr>n<tr>n<td>2</td><td>4</td> <td>6</td><td>8</td><td>10</td></tr>n</table>n"
4、導入R腳本
使用R的source函數:
from rpy2.robjects import r r.source('testrscript.r')
5、轉換R對象為全局變量
因為使用函數robjects.globalenv()將對象轉換成全局變量,特別是遇到python找不到一個R對象時(此時R對象可能通過r('Rcode')調用),留意將R對象轉變成全局變量。
三、R對象轉換成python對象
推薦使用tuple( )或者list( )函數,將R對象轉換成tuple或者list。
>>> a = r('c(1, 2, 3)') >>> a <FloatVector - Python:0x904746c / R:0x9114978> [1.000000, 2.000000, 3.000000] >>> str(a) '[1] 1 2 3n' >>> tuple(a) (1.0, 2.0, 3.0) >>> list(a) [1.0, 2.0, 3.0] >>> b = r('matrix(1:6, 2, 3)') >>> b <Matrix - Python:0x9039c6c / R:0x9114710> [1,2,3,4,5,6] >>> print b [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 >>> tuple(b) (1, 2, 3, 4, 5, 6) >>> list(b)
看完了這篇文章,相信你對python中調用R函數的方法是什么有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。