R 调用 python
上一篇说了python使用 rpy2 调用 R,这里介绍R如何调用python。R的强项在于统计方面,尤其是专业的统计分析,统计检验以及作图功能十分强大,但是在通用性方面,就远不如Python了,比如python可以做web,可以开发GUI,可以爬虫,甚至可以开发游戏,这些R其实也不是完全不行,但是在易用性方面实在是难以与Python相匹敌。所以如果要是能将R与Python相结合,充分发挥二者的优势,那么无疑我们会得到一个更加强大的武器。幸运的是,R 为我们提供了这么一个工具,rPython。
rPython就是连接R与python的一个接口。其主页地址在:http://rpython.r-forge.r-project.org/。按照其官网的介绍,rPython就是为了能够弥补R在某些通用性领域的不足,使用python丰富的库来弥补这些不足之处而诞生的。关于rPython如何工作,官网上写的很清楚了:
How does rPython work?
One of the most daunting tasks in building an interface between two languages is provide mechanisms for exchanging different data structures between them. rPython uses json:
- R/Python objects are dumped into json strings using their respective parsers (RJSONIO and simplejson) respectively.
- These strings are passed between the two languages using their string exchange mechanisms.
- json strings are finally reconstructed into language objects on the other side.
This simple mechanism allow R and Python exchange relatively complex data structures with ease.
翻译过来就是,连接R与python的一个麻烦之处在于这两种语言的不同数据类型的以及对象的传递。rPython使用的解决办法是通过json作为中间对象。即将python与R的数据以及对象先转化为json字符串(python通过simplejson这个库,R通过RJSONIO这个库)进行传递,再转化为相应语言的数据类型就可以了。
这里需要特别提一下rPython在windows下的安装方式。如果你使用的是linux或者mac系统,那么安装rPython是比较简单的一件事情,直接使用命令install.packages("rPython")即可,但是坑爹的是,rPython在windows下没有编译好的包(以前如果我在windows下install.packages安装失败,就直接去CRAN官网找到相应的编译好的包,然后解压到R的library目录下,就可以直接使用了),所以我们必须要自己编译安装了。最开始,我没有找到合适的方法去安装rPython,后来发现了rJython这个包,这个包在CRAN上有编译好的,我成功安装之后,发现也可以使用。额外提一句,通常我们说的Python指的是用C实现的python,即Cpython,但是还有其他语言实现的python,比如Jython就是Java实现的python,Ironpython是.Net和mono平台上的python。pypy是使用纯pyhton写的python。对此有兴趣的可以自行查阅资料。因为装不上rPython,所以我只能使用Jython,使用Jython有利有弊,利当然就是可以无缝调用java一大堆的类库了,弊就是Jython的第三方库相比Cpython少的可怜,好多库都不能用,所以这也是比较蛋疼的一件事情。
但是今天,我终于在github上面找到rPython在windows下的安装方法了。链接在此:https://github.com/cjgb/rPython-win。大概安装步骤如下:
1.下载github的zip文件
2.下载完成之后解压,将文件夹重新命名为rPython
3.在R下安装devtools(一个包管理工具,可以从github上面下载R包),install.packages("devtools")
4.library(devtools)
5.打开解压之后的configure.win文件,大概长下面这个样子:
#!/bin/sh
echo 'PKG_LIBS=-LC:/python27/libs -lpython27' > src/makevars.win
echo 'PKG_CFLAGS=-I"C:/Python27/include"' >> src/makevars.win
原来默认python的安装位置为C:/python27,这里需要将其改为你自己的电脑中python实际安装的位置,以便于在编译时可以正确找到python的安装位置。
做好之后,执行命令:install("yourpath/rPython") ,引号中的内容是你解压rPython的位置。至此,rPython就成功安装了。如果安装过程中报错,比如我的就报错,无法下载RJSONIO,请自行安装相应的缺少的库。
安装成功之后,我们就来看看怎么使用rPython吧。
其实rPython的使用还是比较简单的,就提供了几个调用的接口函数。直接看代码实例吧:
1 # R 调用python 2 library(rPython) 3 python.call("len",1:10) # 调用函数 4 a <- 0:3 5 b <- 1:4 6 python.exec("def connact(a,b):return a+b") # 执行函数 7 c <- python.call("connact",a,b) # 调用函数 8 python.assign( "a", "hola hola" ) 9 a.split <- python.method.call( "a", "split", " " ) # 对a调用split函数,使用空格分割
首先加载rPython这个库。
python.call("len",1:3)表示调用python的len函数对1:3这个向量进行计算,其实就是计算len([1,2,3]),答案当然是3了。python.exec()可以执行一段python代码,这里是执行了一个python函数,我们定义了两个变量的相加,然后使用call调用这个函数,函数的两个参数为a,b,计算结果为c。计算可以得到c的值为c(0,1,2,3,1,2,3,4)为一个向量,其实我们可以发现,R中的向量就对应了python中的列表。然后使用 python.assign()将字符串"hola hola" 赋值给变量a,然后对a调用split方法,split传入参数为空格,即对a按空格进行分割,得到 结果为 "hola" "hola" 这两个字符串。
其他还有一些方法的使用,大家可以自行参考CRAN上的函数帮助手册,或者直接??rPython查看帮助文档。
最后,来看如何在R中调用执行一个python文件。
名为 python_demo.py的文件如下:
# -*- coding:utf-8 -*- import requests ''' 模拟登陆一个叫推酷的网站 ''' s = requests.session() # data为要提交的数据,可以通过firefox的httpfox捕获 data = { 'email':'xxxxx@qq.com', 'password':'xxxxxxx', 'authenticity_token':'ANJyaQEi/IQqiFtLFu4md41p418qigNOzgIjJMwKz9A=', 'remember':'1' } url_login = 'http://www.tuicool.com/login' # 要提交数据的地址 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118Safari/537.36'} res=s.post(url_login,data,headers = headers) r = s.get(url_login) content = r.content with open('tuiku.html','w') as f: f.write(content)
上面的代码使用requests库模拟登录了某一个网站,将返回的内容写入html文件。
只需要使用几行代码就可以从R调用执行这段python文件。
# 使用 rPython 调用 python文件 file_name = "F:/R_work/rPython/python_demo.py" python.load(file_name) # 调用python文件
在R中运行上面的代码,几秒之后,就会发现已经新增了一个html文件。怎么样,是不是很酷呢?
有了rPython之后,以后像数据抓取以及大规模运算等任务就可以交给python了,得到数据之后再传入R,然后利用R的专业的统计包进行统计分析以及作图等。python与R的无缝结合,so cool!