Python 调用 R

作者: hzyido | 来源:发表于2015-07-22 08:53 被阅读66897次

    Python统计分析 调用RO网页链接在python里使用R:rpyO网页链接O网页链接金融领域R语言对比pythonO网页链接让R与Python共舞O网页链接Python是一门适合做数据挖掘的语言吗?O网页链接

    MATLAB调用R

    http://cran.r-project.org/主页——左侧other-R-(D)COM

    Interface

    http://www.omegahat.org/RDCOMServer/

    rcomhttp://rcom.univie.ac.at/download.html#RPackages_rcom

    1.安装R,这当然是必须的了。

    2.下载并安装Rcom server(http://learnserver.csd.univie.ac.at/rcomwiki/doku.php?id=wiki:how_to_install)。

    3.下载MATLAB R-link(http://www.mathworks.com/matlabcentral/fileexchange/5051)。并把里面的m文件复制到matlab的工作目录下。

    4.加载rcom包。(rgui下,程序包-安装程序包,从里面找到rcom)

    5.用MATLAB R-link里面的m文件试验一下。

    里面的几个函数功能如下:

    openR - 连接到R

    evalR - 执行一个R命令

    getRdata - 把R中的一个变量值赋给matlab中的变量

    putRdata - 把matlab中的一个变量赋给R中的变量

    closeR - 关闭和R的连接

    Rdemo - 一个具体的实例.

    http://cran.r-project.org/

    参考内容:MATLAB调用R和C作者:尔玛娜泽

    matlab里可以调用R软件包吗?我该把R软件包装在哪?怎么在matlab里面调用?  

    可以使用Com接口,方法如下:http://www.cs.ubc.ca/~murphyk/Software/callingRfromMatlab.html

    http://www.mathworks.com/matlabcentral/fileexchange/5051

    R与matlab  

    http://f.dataguru.cn/thread-245842-1-1.html

    1.matlab的语法更适合于矩阵操作。R的矩阵操作就要稍弱一点。

    2.R有大量的新的且高质量的包可用。如果一个研究者提出了一个新算法,实现这个算法的R包很快就出来了。但是,matlab几乎无这种可能。不过,matlab提供了很多工具箱,是成熟的、组织良好的一些算法的实现。

    3.R是免费的,轻量级的。matlab的很贵的,并且也是很笨重的。

    4.在统计学方面,特别是在内置函数数量和质量以及处理大数据集的能力上,R要优于matlab。

    5.R有CRAN,在这里几乎可以找到所有需要的东西,包括最新的算法的实现和常用统计技术。matlab的论坛东西相对较少。

    以上参考了这篇博文,以及这篇论文:

    http://blog.sina.com.cn/s/blog_5f234d470101gks0.html

    http://www.math.umaine.edu/~hiebeler/comp/matlabR.pdf

    matlab直接调用R语言

    在Matlab中调用R

    一直往返于Matlab与R之间进行编程,今天发现原来有办法直接用Matlab调用R,

    具体如下:

    Calling R from MatlabThis uses the COM interface, so only works on Windows.

    Install R.2.7.0 or newer. Make sure R.exe is in your windows path.

    Install and run the Rcom server

    Reboot matlab and put the following m-files in your path

    Optional: in R-2.7.0\bin make a file called "R.init" which contains startup commands, such as library(glasso)

    In matlab, type Rdemo. This should display b = 1 4 9 16 25 36 49 64 81 100c = 2 5 10 17 26 37 50 65 82 101

    You can also call R as a subprocess as follows !R --no-save # at the matlab promptq() # at the R prompt to quit.

    Trouble shooting

    If it's not working make sure the Dcom service is running under Control Panel --> Administrative Tools --> Services --> DCOM Server Process Launcher. You can start the service by right clicking and selecting 'start', (unless of course its already running) and have it always start on reboot by double clicking and changing the startup type to automatic.

    The Rsvr install creates a bunch of shortcuts under the R program folder on the start bar. One of these, "server 01 Basic Test" will test the connection to R - if that works we know the problem is between Matlab and Dcom and also unlikely to be a firewall problem.

    ExampleA matlab wrapper to the glasso function.function precMat = glassoR(C, rho, useMBapprox)% Use L1-linear regression to find markov blankets and then Lambda.% Uses R code from http://www-stat.stanford.edu/~tibs/glasso/openR;evalR('C<-1') % must pre-declare variable before writing a matrixevalR('L<-1') putRdata('C',C);putRdata('rho',rho);putRdata('useMBapprox', useMBapprox)evalR('stuff <- glasso(C,rho=rho,approx=useMBapprox)'); evalR('L <- stuff$wi') % inverse covariance matrixprecMat = getRdata('L');closeR;经过本人安装测试,发现运用开始菜单中R下的Dcom中的Server 01进行测试,无法通过,报错如下 Loading StatConnector Server... Done Initializing R...Function call failed Code: -2147221485 Text: installation problem: unable to load connector Releasing StatConnector Server...Done经查证,原来Dcom Server需要在系统的Path中能够找到rproxy.dll和R.dll两个文件,R.dll一般直接安装R时机有即有,而rproxy.dll在R2.7.0以后的版本中不再使用,变为rpcproxy.dll,而且需要手动安装

    rpcproxy包才会有,安装rpcproxy包后,需要将rpcproxy.dll所在目录手动添加到系统path中,比如

    我安装完后,rpcproxy.dll在C:\Program Files\R\R-2.9.0\library\rscproxy\libs中,如此步骤后,

    再运行Server 01进行测试,点击StartR,一切Done!

    http://hi.baidu.com/binaryfan/item/08a21b0947d30de2f45ba666

    本文来自: 人大经济论坛 MATLAB等数学软件专版 版,详细出处参考: http://bbs.pinggu.org/forum.php?mod=viewthread&tid=2122101&page=1

    MATLAB调用R和C  统计-不确定和随机的世界的博客

    1.安装R,这当然是必须的了。

    2.下载并安装Rcom server(http://learnserver.csd.univie.ac.at/rcomwiki/doku.php?id=wiki:how_to_install)。

    3.下载MATLAB R-link(http://www.mathworks.com/matlabcentral/fileexchange/5051)。并把里面的m文件复制到matlab的工作目录下。

    4.加载rcom包。(rgui下,程序包-安装程序包,从里面找到rcom)

    5.用MATLAB R-link里面的m文件试验一下。

    里面的几个函数功能如下:

    openR - 连接到R

    evalR - 执行一个R命令

    getRdata - 把R中的一个变量值赋给matlab中的变量

    putRdata - 把matlab中的一个变量赋给R中的变量

    closeR - 关闭和R的连接

    Rdemo - 一个具体的实例.

    上篇日志转了一篇Matlab调用C语言函数,http://lieu_497481.blog.163.com由于没有亲身操纵,不知道那个是不能够实现的。今天下午自己研究了一下,终于调试成功。还拿上篇日志里提到的add()函数为例,可运行的代码如下:(说明在后面)#include "mex.h"

    double add(double y, double x)

    {

    return y+x;

    }

    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

    {

    double x, y;

    double *z;

    int mrows, ncols;

    if(nrhs!=2){

    mexErrMsgTxt("需要一个输进参数.");

    }

    else if(nlhs>1){

    mexErrMsgTxt("输出参数太多.");

    }

    mrows=mxGetM(prhs[0]);

    ncols=mxGetN(prhs[0]);

    if(!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1)){

    mexErrMsgTxt("输进变量必须是非复数类型的标量.");

    }

    plhs[0]=mxCreateDoubleMatrix(1, 1, mxREAL);

    x=*(mxGetPr(prhs[0]));

    y=*(mxGetPr(prhs[1]));

    z=mxGetPr(plhs[0]);

    *z=add(y, x);

    } 与上篇相比,我们可以发现,核心部分没有什么不同,只是添加了一些蓝色部分代码,这部分代码主要是判定输进输出参数个数是否符合要求,对算法赋值什么的没有影响(我感觉是可以删除的,但是删除后就不能运行,不知道为什么)。有些细节需要留意:1、mex -setup后,有个cd(dir),编的.c文件要保存到这个目录下,否则会提示找不到文件;2、在matlab的command window下进行mex add.c时,上面的目录也要选择是在cd(dir)下才可以;这些都是我犯过的错误,很低级,但是有时候就是折磨你调试不能通过。不管怎样,题目算是解决了

    如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:

    double add(double x, double y) {

    return x + y;

    }

    现在我想要在Matlab中使用它,比如输入:

    >> a = add(1.1, 2.2)

    3.3000

    要得出以上的结果,那应该怎样做呢?

    解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。

    可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。

    所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。

    比如该C文件已写好,名为add.c。那么在Matlab中,输入:

    >> mex add.c

    就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。

    我们现在来说mexFunction怎样写。

    mexFunction的定义为:

    void mexFunction(

    int nlhs,

    mxArray *plhs[],

    int nrhs,

    const mxArray *prhs[]) {

    }

    可以看到,mexFunction是没返回值的,它不是通过返回值把结果传回Matlab的,而是通过对参数plhs的赋值。mexFunction的四个参数皆是说明Matlab调用MEX文件时的具体信息,如这样调用函数时:

    >> b = 1.1; c = 2.2;

    >> a = add(b, c)

    mexFunction四个参数的意思为:

    nlhs = 1,说明调用语句左手面(lhs-left hand side)有一个变量,即a。

    nrhs = 2,说明调用语句右手面(rhs-right hand side)有两个自变量,即b和c。

    plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a。

    prhs和plhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了b,prhs[1]指向了c。要注意prhs是const的指针数组,即不能改变其指向内容。

    因为Matlab最基本的单元为array,无论是什么类型也好,如有double array、 cell array、 struct array……所以a,b,c都是array,b = 1.1便是一个1x1的double array。而在C语言中,Matlab的array使用mxArray类型来表示。所以就不难明白为什么plhs和prhs都是指向mxArray类型的指针数组。

    完整的add.c如下:

    // add.c

    #include "mex.h" // 使用MEX文件必须包含的头文件

    // 执行具体工作的C函数

    double add(double x, double y) {

    return x + y;

    }

    // MEX文件接口函数

    void mexFunction(

    int nlhs,

    mxArray *plhs[],

    int nrhs,

    const mxArray *prhs[]) {

    double *a;

    double b, c;

    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);

    a = mxGetPr(plhs[0]);

    b = *(mxGetPr(prhs[0]));

    c = *(mxGetPr(prhs[1]));

    *a = add(b, c);

    }

    mexFunction的内容是什么意思呢?我们知道,如果这样调用函数时:

    >> output = add(1.1, 2.2);

    在未涉及具体的计算时,output的值是未知的,是未赋值的。所以在具体的程序中,我们建立一个1x1的实double矩阵(使用mxCreateDoubleMatrix函数,其返回指向刚建立的mxArray的指针),然后令plhs[0]指向它。接着令指针a指向plhs[0]所指向的mxArray的第一个元素(使用mxGetPr函数,返回指向mxArray的首元素的指针)。同样地,我们把prhs[0]和prhs[1]所指向的元素(即1.1和2.2)取出来赋给b和c。于是我们可以把b和c作自变量传给函数add,得出给果赋给指针a所指向的mxArray中的元素。因为a是指向plhs[0]所指向的mxArray的元素,所以最后作输出时,plhs[0]所指向的mxArray赋值给output,则output便是已计算好的结果了。

    上面说的一大堆指向这指向那,什么mxArray,初学者肯定都会被弄到头晕眼花了。很抱歉,要搞清楚这些乱糟糟的关系,只有多看多练。

    实际上mexFunction是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测试,以确保输入正确。如在add函数的例子中,用户输入char array便是一种错误了。

    从上面的讲述中我们总结出,MEX文件实现了一种接口,把C语言中的计算结果适当地返回给Matlab罢了。当我们已经有用C编写的大型程序时,大可不必在Matlab里重写,只写个接口,做成MEX文件就成了。另外,在Matlab程序中的部份计算瓶颈(如循环),可通过MEX文件用C语言实现,以提高计算速度。

    linux运行python程序

    python脚本输入输出交互控制

    python中输出和输入中文

    python中函数的参数匹配

    python的包安装和管理

    python配置和使用CGI

    python中调用R

    需要在python中调用R,实在是一种无奈的选择。如果能在一门语言中独立完成课题,是一个比较理想的做法。但是,这种想法也不太现实,毕竟每一种语言都有自己的长处。如果能取长补短,综合使用各种语言,也能起到不错的效果。

    现在遇到的问题是,如何在python中调用R?这其中包括了如何调用R的对象(函数和包),R和python的对象如何互相转换,以及如何调用R的脚本(外界参数的输入)。python提供了一个模块rpy2,可以较好地完成这项工作。

    1. 安装rpy2

    rpy2的网址:http://rpy.sourceforge.net/index.html

    可以使用easy_install安装,

    #easy_install numpy

    #easy_install pandas

    #easy_install rpy2

    如果出现报错,可以先安装

    #yum install ipython python-virtualenv R-core R-devel PyQt4 PyQt4-devel libpng-devel blas blas-devel lapack lapack-devel readline-devel

    注意事项

    1. 如果是源代码编译安装R,需要在configure步骤加入后缀 --enable-R-shlib

    2. 需要安装python-devel包

    2. python调用R对象

    2.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,]13579

    [2,]246810

    $b

    [1] "Hello"

    >>>tmp.names

    ['a', 'b']

    >>>tmp.rx('a')

    [Matrix]

    a:

    [1,2,3, ...,8,9,10]

    >>>tmp.rx(1)

    [Matrix]

    a:

    [1,2,3, ...,8,9,10]

    >>>tmp.rx2(1)

    [1,2,3, ...,8,9,10]

    >>>tmp.rx2('a').rx(1, 1)# first element of 'a'

    [1]

    >>>tmp.rx2('a').rx(1, True)# first row of 'a'

    [1,3,5,7,9]

    ========================================

    注意事项:

    1. 如果函数有警告(warnings),在ipython等IDE上能够执行,但是如果是脚本或者与网页服务器交互,则会产生错误。解决办法:1. 鲁莽的解决很简单,强行忽略R的警告,options(warn = -1)或者R代码放入函数中suppressWarnings()。2. 第二种办法,如果是自己代码中使用了warning()函数,则将warning信息换成字符串,之后单独输出。

    2. 如果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,] 02468

    [2,] 13579

    ========================================

    2.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)

    >>>

    ===================================================

    注意事项:

    1. 使用vector系列函数时,输入的只能是python的列表,而不能是数字或者字符串。

    2.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] "\n\n\n\n\n13579246810\n"

    =========================================================================

    3. 对于向量、矩阵、数据框和列表,都可以使用各自对象names(或者colnames,rownames)进行命名和修改命名。

    2.4 导入R脚本

    使用R的source函数:

    ========================

    from rpy2.robjects import r

    r.source('testrscript.r')

    =======================

    2.5 转换R对象为全局变量

    因为使用函数robjects.globalenv()将对象转换成全局变量,特别是遇到python找不到一个R对象时(此时R对象可能通过r('Rcode')调用),留意将R对象转变成全局变量。

    3. R对象转换成python对象

    推荐使用tuple( )或者list( )函数,将R对象转换成tuple或者list。

    ==========================================

    >>>a = r('c(1, 2, 3)')

    >>>a

    [1.000000, 2.000000, 3.000000]

    >>>str(a)

    '[1] 1 2 3\n'

    >>>tuple(a)

    (1.0, 2.0, 3.0)

    >>>list(a)

    [1.0, 2.0, 3.0]

    >>>b = r('matrix(1:6, 2, 3)')

    >>>b

    [1,2,3,4,5,6]

    >>>print b

    [,1] [,2] [,3]

    [1,]135

    [2,]246

    >>>tuple(b)

    (1, 2, 3, 4, 5, 6)

    >>>list(b)

    [1, 2, 3, 4, 5, 6]

    ==========================================

    参考文献和注释:

    注释1:对于R代码,即便是将一段R代码写成一行(尽管看起来很丑陋而且不推荐),一样可以执行。但是,反过来,对于python代码则没有这么简单。因为,python代码是靠缩进来划分代码的区域,假若一段代码中有两个循环嵌套,如果此时将所有代码写成一行,执行起来就要麻烦的多(很可能要依赖空格的多少进行解释)

    1.http://www.jeffkit.info/2010/02/475/

    2. 文档:http://rpy.sourceforge.net/rpy2/doc-2.2/html/introduction.html

    3. fedora 19安装rpy2:http://thomas-cokelaer.info/blog/2013/09/fedora-19-post-installation/

    Python统计分析:[5]调用R

    更新:2014-10-14 08:00

    百度经验:jingyan.baidu.com

    Python做统计还不太成熟,很多需要的统计方法并没有现成的Python模块或者方法,而笔者也不是专门的统计出身,所以并不想自己去开发一些算法,所以我选择调用R来实现部分统计功能,毕竟R包含的统计包更多。今天示范一下如何在Python中调用R来进行一些简单的统计。

    先引入相关模块,rpy2就是Python中的r接口

    假如我们想要用R中的一些常量,比如pi,可以这样调用

    输出结果为:

    我们还可以将pandas的DataFrame对象转换为R中的data.frame对象或者matrix,下面先读取一个数据,生成DataFrame

    生成r中的dataframe

    输出结果为:

    转换为矩阵:

    当然,我们还可以调用R中的方法来进行绘图,比如绘制一个散点图:

    你会看到弹出一个窗口,展示了绘制好的散点图:


    让R与Python共舞

    转载:http://ices01.sinaapp.com/?p=129

    R(又称R语言)是一款开源的跨平台的数值统计和数值图形化展现 工具。通俗点说,R是用来做统计和画图的。R拥有自己的脚本语言和大量的统计、图形库(得益于开源社区),这让她看起来既美又实用。与其他同类软件(如 SPSS)相比,R的特点是纯命令行的,这倒也好,我们更应该把注意力放在数据本身,而非统计工具的UI。

    R虽说有一套自己的语言,还挺完备,但她最专业的还是做统计和画图,而像连接数据库、文本处理、文件操作等这些脏活可不能委屈R来干哪,这些得有其 他语言来负责,我的选择是咱最熟悉的、做这些脏活最棒的Python。那接下来的问题很清楚了,R和Python如何一起工作?拍拍脑袋,想到可能有下面 几种办法:

    1. R和Python只共享文件,Python把源数据处理干净,生成格式化的文件放在预定的目录下,做个定时器让R去读文件,最终输出统计结果和图表。

    这种做法一定程度上可行,除了做定时器外,还可以让Python即时执行”rscript”命令调用R脚本来工作,只是这种办法限制太大,只能够交换文件,Python不能对R进行精确的控制。

    2. 让Python直接调用R的函数,R是开源项目,肯定会有一些第三方库实现Python与R互通。

    果然,我找到了rpy2,可以实现使用python读取R的对象、调用R的方法以及Python与R数据结构转换等。实际上除了Python,其他语言与R互通的第三方包也大大的有。

    最后我选择第2种方法,来让R与Python共舞。

    模块 rpy2.robjects 是rpy2对R的一个高级封装,该模块里包含了一个r对象和一系列的R数据结构。使用rpy2的大多数情况,只需要跟这个模块打交道即可。rpy2的安装 在此不多讲了,有兴趣的同学看文档去,直接体验一下R如何与Python无缝整合吧。

    了解r实例r实例是指rpy2.robjects.r,它是在Python中的嵌入式R进程,把r当作从python走向R的通道来看就可以了。通过r实例,我们可以读取R的内置变量、调用R的函数、甚至,直接把它当作R的解析器来用。

    访问R的对象在R的命令行中,我们直接输入对象名来访问R的内置对象,如pi、letters:

    在R控制台中访问R对象

    而使用r实例,python访问R对象也很简单,而且方法很多:

    在python中访问R对象

    在这段代码中,我们用了三种方式来访问R对象,把r实例当作字典,把r实例当作方法,把r实例当 作一个类对象(真是神喻呀~)。在实际中,使用哪一种方式要因习惯而异,我喜欢的方法是使用第三种,把r实例当作自己人,直接使用”.”来访问R对象。但 这种方法有一个缺陷,就是不能访问带名字空间的R对象或函数,而其他两种方式是可以的,这点将在随后说明。

    调用R函数通过r实例,我们可以轻易地实现用Python调用R的函数。下面我们分别在R控制台和python命令行下读一个数据文件并画一张点图。

    R控制台读取文件画点图

    代码解读:

    data.csv 的内容就是上面代码的3到7的内容。

    data = read.table(‘data.csv’) :把文件读进一个数据框变量data中。

    mtx = data.matrix(data):把data转变成矩阵。

    dotchart(mtx)用矩阵的数据画点图。

    结果如下:

    接下来用python来做一遍同样的事情,我们之前了解到,使用r实例可以直接访问R对象,还可 以直接调用R的函数,其实在Python看来,对象和函数是相同的东西,函数也是一种对象罢了。现在来试一下调用”read.table()”函数读入一 个数据文件data.csv:

    出错了!怎么回事?在上面我提到过了,使用“.”引用的方式不能访问带有名字空间的R对象和函数,read.table 是表示在read包下面的table函数,通过”.”的形式调用失败,必须要用字典的方式或参数的方式来获得:

    这段代码得到的结果与在R控制台下画点图的效果是一样的。最后一行 r.dotchart(mtx)是直接通过”.”来调用R的函数dotchart的,在没有名实空间的情况下,是正常的。如果你为了避免太多不可控制的出 错机会,你可以统一地使用字典的方式来访问R对象和方法,这是最保险的方法,虽然我个人认为看起来有点别扭。

    r实例就是一R控制台其实r实例就是一个可交互的R控制台,只不过交互对象是Python与R罢了,为了证明r实例具有R控制台的特性,来做个实验,写一串R脚本,作为Python一个字符串变量的内容,把该字符串传给r实例,然后把r实例当作方法来调用:

    出来的结果这样:

    注意,把r实例当作控制台,只能够通过r(r代码)的方式来使用r实例,字典的方式行不通。

    加载自定义函数在实际应用中,使用R语言来编写自己的函数同样是不可避免的,在R控制台中,可以使用source(‘script_path’)的方法来加载自定 义R脚本。而在Python中使用自己义R脚本中的函数也同样方便:使用r.source(‘script_path’)即可把自定义函数加载到全局环境 中,再使用r.自定义方法名就可以实现调用,我就是这样做的,在此不再详述,同学们自己动手玩一下。

    R Vector与Python list向量(Vector)是R的一个最重要的也是最常用的数据类型,可以理解为一个二维数据,对应Python的list。在R控制台中,声明一个变 量:“x <- 1”,X会被声明成一个向量,而其第一个值是1。R常常用c()函数来声创建一个由多个值组成的向量,例如c(1,2,3,4)。Python要与R打交 道,除了访问R对象和调用R函数,还有就是要学会如何转换常见的数据类型。

    rpy2提供了几个类,供我们把Python的list转换成R的Vector。分别是 robjects.IntVector,robjects.Boolvector,robjects.StringVector,robjects.FloatVector. 以IntVector为例,将Python的list转换成R的Vector:robjects.IntVector([1,2,3,4,5]),毕!

    下面来使用刚学到的类型转换知识画上一个例子的散点图来结束此次体验:

    还在继续…..rpy2提供的不仅仅是上面这些,上面的知识只是rpy2所提供的20%,但是已经足以解决80%的问题。rpy2还提供了更低级的API,你可以做更多的事情,例如你可以实现另一个robjects对象来支持使用”.”来访问带名字空间的对象和函数。更多的知识,请移步官方文档

    Python 通过rpy2调用 R语言

    2014年9月23日

    github有完整的软件包 】

    系统环境

    python 2.7.4  32bit

    R 3.0.1  i386-w64-mingw32/i386 (32-bit)

    rpy2 2.3.7  32bit

    windows 8  64bit

    安装方法

    rpy2 官方不支持windows了,python 2.7安装官方版本会报错。

    下面的地址安装非官方的 rpy2

    安装地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#rpy2

    注意:(这里没有测试,因为我之前安装了numpy 和 vc++ 2008,如果安装出错这里也许有帮助)

    Many binaries depend on Numpy-MKL 1.7 and/or the Microsoft Visual C++ 2008 (64 bit or 32 bit, for CPython 2.6 to 3.2) redistributable packages.

    rpy2的文档在这里

    需要设置环境变量:

    path :安装路径\bin  #例如 C:\R-3.0.1\bin

    R_Home :安装路径  #例如 C:\R-3.0.1

    R_User :可以也设置为安装路径  #例如 C:\R-3.0.1\bin

    简单的例子:

    import rpy2

    from rpy2 import robjects as ro

    r=ro.r

    r("pi")

    example文件夹中将给出各种例子

    参考资料

    sourceforge.net

    www.blogosfera.co.uk

    Github–bwallace/OpenMeta-analyst-

    【R(dplyr)和Python(Pandas)数据处理对照参考表】《Data munging in R with dplyr and inPythonwith Pandas》O网页链接方便实现语言间迁移,实用!  另一个比较R(dplyr)和Python(Pandas)的ipn,也很不错:O网页链接

    相关文章

      网友评论

        本文标题:Python 调用 R

        本文链接:https://www.haomeiwen.com/subject/bpipqttx.html