91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中調用R函數的方法是什么

發布時間:2020-09-03 10:44:18 來源:億速云 閱讀:314 作者:小新 欄目:編程語言

小編給大家分享一下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函數的方法是什么有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰和县| 盐边县| 霍林郭勒市| 通江县| 莒南县| 临安市| 开远市| 平原县| 海淀区| 肥城市| 尼玛县| 萝北县| 广饶县| 涪陵区| 乌兰浩特市| 临武县| 岳池县| 武功县| 彭水| 永新县| 龙山县| 日喀则市| 板桥市| 瑞昌市| 开化县| 上杭县| 高尔夫| 桃园县| 临武县| 泽州县| 达日县| 莱阳市| 伊宁县| 巩义市| 奇台县| 琼海市| 临汾市| 淮阳县| 司法| 余江县| 古蔺县|