R 调用 python

简介:   上一篇说了python使用 rpy2 调用 R,这里介绍R如何调用python。R的强项在于统计方面,尤其是专业的统计分析,统计检验以及作图功能十分强大,但是在通用性方面,就远不如Python了,比如python可以做web,可以开发GUI,可以爬虫,甚至可以开发游戏,这些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!

热爱编程,热爱机器学习! github:http://www.github.com/Lyrichu github blog:http://Lyrichu.github.io 个人博客站点:http://www.movieb2b.com(不再维护)
目录
相关文章
|
数据采集 JSON 搜索推荐
Python 调用Zoomeye搜索接口
钟馗之眼是一个强大的搜索引擎,不同于百度谷歌,它主要收集网络中的主机,服务等信息,国内互联网安全厂商知道创宇开放了他们的海量数据库,对之前沉淀的数据进行了整合、整理,打造了一个名符其实的网络空间搜索引擎ZoomEye,运用Python接口可以灵活的实现数据采集。
277 0
Python 调用Zoomeye搜索接口
|
数据安全/隐私保护 Python
python接口自动化(三十四)-封装与调用--函数和参数化(详解)
参数化的思维只需记住一点:不要写死,这样就便于维护,否则就会牵一发而动全身,一处修改导致处处修改,不便于维护。
1204 1
python接口自动化(三十四)-封装与调用--函数和参数化(详解)
|
Java C# 决策智能
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex(下)
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex(下)
|
Java 测试技术 C#
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex(上)
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex
运筹优化学习09:一个示例带你入门如何使用C++、C#、Java、Python、Matlab调用Cplex(上)
|
NoSQL Redis 开发工具
python调用redis-cell(CL.THROTTLE)
python调用redis-cell(CL.THROTTLE)
250 0
python调用redis-cell(CL.THROTTLE)
|
Linux Python
linux qt 项目中QProcess调用命令行命令执行python脚本
linux qt 项目中QProcess调用命令行命令执行python脚本
linux qt 项目中QProcess调用命令行命令执行python脚本
|
数据管理 测试技术 API
python接口自动化(三十七)-封装与调用--读取excel 数据(详解)
在进行软件接口测试或设计自动化测试框架时,一个不比可避免的过程就是: 参数化,在利用python进行自动化测试开发时,通常会使用excel来做数据管理,利用xlrd、xlwt开源包来读写excel。例如:当我们登录的账号有多个的时候,我们一般用 excel 存放测试数据,本篇文章介绍,python 读取excel 方法,并保存为字典格式。
382 0
python接口自动化(三十七)-封装与调用--读取excel 数据(详解)
|
jenkins 测试技术 持续交付
python接口自动化(三十六)-封装与调用--流程类接口关联续集(详解)
上一篇已经给大家都介绍过了流程类接口关联,但是由于博客的登录机制改变,所以没有办法给小伙伴们实战演练一下,那么这篇就按照上一篇计划的用jenkins来给小伙伴们演示一下流程类接口的封装和调用,其实很简单,就是用上一篇和前边这篇传送门的代码稍稍修改即可。不知道你自己练习了么,如果练习了,可以看看和我有什么不同,没练习的看看自己思路和我有啥不一样。好了废话少说进入主题
203 0
python接口自动化(三十六)-封装与调用--流程类接口关联续集(详解)
|
jenkins 测试技术 持续交付
python接口自动化(三十五)-封装与调用--流程类接口关联(详解)
流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便。在这里我们还是以博客园为例,带着小伙伴们实践一下。
394 0
python接口自动化(三十五)-封装与调用--流程类接口关联(详解)
|
编译器 API C++
python 外部传参程序编写并打包exe及其调用方式
每种编程语言相互联系又相互独立,为此使用某种编程语言编写的程序都能够独立封装和生成自己的运行程序exe或者其他的API接口。而对于这样的运行程序目的往往不是用于双击使其运行的,而是通过外部传入的参数运行其中的内核函数达到某种目的的。所以在此研究python如何编写外部传参的程序,并将其封装未exe便于外部使用。
835 0
python 外部传参程序编写并打包exe及其调用方式