上一篇说了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的使用还是比较简单的,就提供了几个调用的接口函数。直接看代码实例吧:

 # R 调用python
library(rPython)
python.call("len",1:10) # 调用函数
a <- 0:3
b <- 1:4
python.exec("def connact(a,b):return a+b") # 执行函数
c <- python.call("connact",a,b) # 调用函数
python.assign( "a", "hola hola" )
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':''
}
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!

R 调用 python的更多相关文章

  1. R调用python模块

    明明已经安装了sctransfer,但仍然显示没有该模块 Error in py_module_import(module, convert = convert) : ModuleNotFoundEr ...

  2. R和Python,对抗or融合?

    来源商业新知网,原标题:从对抗到融合,教你充分利用R+Python! 我们应该将关注点放在技能上,而不是工具上. 如果你从事数据科学的工作,可能会立即想到两种编程语言:R和Python. 事实上,R和 ...

  3. Java-调用R语言和调用Python(前后端展示)

    1. 背景 R语言和Python用于数据分析和数据处理,并生成相应的直方图和散点图 需要实现一个展示平台,后端使用Java,分别调用R语言和调用Python,并返回数据和图给前端显示 这个平台主要实现 ...

  4. C++调用python

    本文以实例code讲解 C++ 调用 python 的方法. 本文在util.h中实现三个函数: 1. init_log: 用google log(glog)初始化log 2. exe_command ...

  5. PHP调用Python接口过程中所遇到的问题

    在php调用python脚本时,首先把python相关组件安装完善.用Python命令检测运行脚本而不报错. 在调用接口的过程 1.没有打开的python脚本的权限 解决办法:把python脚本所在的 ...

  6. c#调用python代码

    c#调用python的方法比较多,比如ironpython,尽管不用安装python环境,可是不兼容python众多的包,也只更新到了python2,通过创建python进程这种方式可以很好的解决兼容 ...

  7. java调用python的惨痛史(无法获取环境变量)

    环境:java,was,python2.6,红帽linux,oracle,python用cx_Oracle        事情是这样的,有个需求,需要对数据库进行处理,简单说就是把数据取出来,用pyt ...

  8. 让R与Python共舞

    转载:http://ices01.sinaapp.com/?p=129      R(又称R语言)是一款开源的跨平台的数值统计和数值图形化展现 工具.通俗点说,R是用来做统计和画图的.R拥有自己的脚本 ...

  9. c++调用Python基础功能

    c++调用Python首先安装Python,以win7为例,Python路径为:c:\Python35\,通过mingw编译c++代码.编写makefile文件,首先要添加包含路径:inc_path ...

随机推荐

  1. True 和 False

    True 和 False是Python中的关键字. 'True' 和 'False'是Python中的字符串. true 和 false 是Python中的变量名,需要提前定义.

  2. Ubuntu下配置ShadowS + Chrome

    // 这是一篇导入进来的旧博客,可能有时效性问题. 题目和全文中的ShadowS指代以ShadowS开头名字的某工具,以预防文章被和谐.本机Ubuntu 14.04 LTS.在apt-get upda ...

  3. HDU 1068 Girls and Boys(模板——二分图最大匹配)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1068 Problem Description the second year of the univ ...

  4. TCP协议中三次握手

    TCP/IP是互联网相关的各类协议族的总称 TCP/IP协议族分为:应用层,传输层,网络层,数据链路层 应用层:向用户提供应用服务时的通讯的活动 传输层:提供处于网络连接中的两台计算机之间的数据传输 ...

  5. 转:绝对干货--WordPress自定义查询wp_query所有参数详细注释

    <?php /** * WordPress 查询综合参考 * 编译:luetkemj - luetkemj.com * * 官方文档: http://codex.wordpress.org/Cl ...

  6. api接口token验证

    接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程: 3.有点接口需要用户登录 ...

  7. dedecms系统后台登陆提示用户名密码不存在

    dedecms最近被曝有非常多的安全漏洞,最近有些用户反应后台管理员账号密码没有修改但无法正常登陆,提示用户名不存在,经研究发现是程序漏洞管理员被直接篡改,解决方案如下. 工具/原料 dedecms ...

  8. angular4 中自定义pagination组件

    你用Angular 吗? 一.介绍 一个基于angular4 开发的可以分页的组件.组件的好处就是可以复用,复用.....作为一个前端码农,开始的分页功能实现是我用jquery写的,其他同事用的时候都 ...

  9. 寄存器(CPU原理)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  10. window安装swagger editor

    1.下载 nodejs,并安装 2. 下载swagger editor并安装 2.1 git clone https://github.com/swagger-api/swagger-editor.g ...