rpy2包

99 阅读2分钟

Python 与 R 是两种常用的数据分析语言,Python 提供丰富的大数据分析方法与框架,但 R 在专业领域(例如生信分析)更受研究人员青睐。如果想要在 Python 中使用特殊 R 包的中的方法,可以使用rpy2包实现。

rpy2包,是通过 Python 生成一个内置 R 进程(embedding)实现的,因此实际上还是使用 R 语句进行操作,不过需要通过“代理”的方式,下面的一个基础例子(来自官方文档)给出了这种代理的方式。 以下是关键代码:

rpy2.robjects.r()起到命令行的作用
rpy2.robjects.rpackage处理包相关部分
rpy2.robjects.vector将python数据转换为Rvector数据
返回的包或者函数(作为python对象)可以调用其中的方法。

import rpy2
import rpy2.robjects as robjects
from rpy2.robjects.packages as rpackage 
from rpy2.robjects.vectors import StrVector 


base=rpackage.importr('base') 
utils=rpackages.importr('utils')#通过importr实现对基础包的引入(library)
utils.chooseCRANmirror(ind=1) # 如果需要安装特殊包,需要指定CRAN



packnames = ('ggplot2', 'hexbin')
names_to_install = [x for x in packnames if not rpackages.isinstalled(x)]
if len(names_to_install) > 0:
    utils.install_packages(StrVector(names_to_install))
    # strvector 将 python数据转换为R数据
    # 我们也可以看到,想使用utils包中的install_package,可以直接通过调用python对象utils中的方法实现,但是要输入R数据对象。
    

pi = robjects.r('pi') 
# 注意,返回的结果是一个vector而不是值,pi[0]才能获得一个值,或者使用pi.r_repr()得到字符值


# 使用robjects.r作为代理生成一个R函数f(注意这里使用的是R语法)
robjects.r('''
        # create a function `f`
        f <- function(r, verbose=FALSE) {
            if (verbose) {
                cat("I am calling f().\n")
            }
            2 * pi * r
        }
        # call the function `f` with argument value 3

        ''')

r_f = robjects.globalenv['f'] #注意这里是方括号
print(r_f.r_repr()) #此处没有展示出结果 
res = r_f(3) #此处调用r,并不需要先将数据转化为R数据对象,因为这里是简单数据3,而上面的转换是要将python列表数据变成R向量数据。


# 这里再介绍一个绘图
r = robjects.r # 类似建立一个终端

x = robjects.IntVector(range(10))
y = r.rnorm(10)

#r.X11() #图形驱动部件,可能需要。

r.layout(r.matrix(robjects.IntVector([1,2,3,2]), nrow=2, ncol=2))
r.plot(r.runif(10), y, xlab="runif", ylab="foo/bar", col="red")