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")