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:

  1. R/Python objects are dumped into json strings using their respective parsers (RJSONIO and simplejson) respectively.
  2. These strings are passed between the two languages using their string exchange mechanisms.
  3. 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!

点赞