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的使用还是比较简单的,就提供了几个调用的接口函数。直接看代码实例吧:
# 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的更多相关文章
- R调用python模块
明明已经安装了sctransfer,但仍然显示没有该模块 Error in py_module_import(module, convert = convert) : ModuleNotFoundEr ...
- R和Python,对抗or融合?
来源商业新知网,原标题:从对抗到融合,教你充分利用R+Python! 我们应该将关注点放在技能上,而不是工具上. 如果你从事数据科学的工作,可能会立即想到两种编程语言:R和Python. 事实上,R和 ...
- Java-调用R语言和调用Python(前后端展示)
1. 背景 R语言和Python用于数据分析和数据处理,并生成相应的直方图和散点图 需要实现一个展示平台,后端使用Java,分别调用R语言和调用Python,并返回数据和图给前端显示 这个平台主要实现 ...
- C++调用python
本文以实例code讲解 C++ 调用 python 的方法. 本文在util.h中实现三个函数: 1. init_log: 用google log(glog)初始化log 2. exe_command ...
- PHP调用Python接口过程中所遇到的问题
在php调用python脚本时,首先把python相关组件安装完善.用Python命令检测运行脚本而不报错. 在调用接口的过程 1.没有打开的python脚本的权限 解决办法:把python脚本所在的 ...
- c#调用python代码
c#调用python的方法比较多,比如ironpython,尽管不用安装python环境,可是不兼容python众多的包,也只更新到了python2,通过创建python进程这种方式可以很好的解决兼容 ...
- java调用python的惨痛史(无法获取环境变量)
环境:java,was,python2.6,红帽linux,oracle,python用cx_Oracle 事情是这样的,有个需求,需要对数据库进行处理,简单说就是把数据取出来,用pyt ...
- 让R与Python共舞
转载:http://ices01.sinaapp.com/?p=129 R(又称R语言)是一款开源的跨平台的数值统计和数值图形化展现 工具.通俗点说,R是用来做统计和画图的.R拥有自己的脚本 ...
- c++调用Python基础功能
c++调用Python首先安装Python,以win7为例,Python路径为:c:\Python35\,通过mingw编译c++代码.编写makefile文件,首先要添加包含路径:inc_path ...
随机推荐
- 登录模块的进化史,带大家回顾java学习历程(二)
接着前面的登录模块的进化史,带大家回顾java学习历程(一) 继续往下面讲 前面我们去实现登录功能,都是想着要完成这个功能,直接在处理实际业务的类中去开始写具体的代码一步步实现,也就是面向过程的编程. ...
- Nginx常用配置实例(4)
Nginx作为一个HTTP服务器,在功能实现方面和性能方面都表现得非常卓越,完全可以与Apache相媲美,几乎可以实现Apache的所有功能,下面就介绍一些Nginx常用的配置实例,具体包含虚拟主机配 ...
- Mistakes in Hello World
今天在cmd中用Python写第一行代码"Hello World"出现错误. 写好的源码"HelloWorld.py"存放于" F:\learning ...
- Java反射-高级知识掌握
PS:本文就Java反射的高级知识做下汇总,理清在什么情况下,我们应该去使用反射,提供框架的健壮性,ps:xieyang@163.com/xieyang@163.com
- python网络数据采集(伴奏曲)
这里是前章,我们做一下预备.之前太多事情没能写博客~.. (此博客只适合python3x,python2x请自行更改代码) 首先你要有bs4模块 windows下安装:pip3 ...
- [bzoj1774] [Usaco2009 Dec]Toll 过路费
Floyd神用法...设dis[i][j]表示i点到j点的最短路(只算边权),map[i][j]表示i到j最小费用 将n个点先按照点权排一下序...这样就可以比较方便的求出路径上最大点权了... 因为 ...
- Centos7搭建Confluence破解版
Confluence破解版 应用环境: Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki.通过它可以实现团队成员之间的协作和知识共享. 系统及安装软件 centos7 ...
- FineReport父子格实现动态参数注入
"深入学习FineReport后发现其功能及其强大,之前使用存储过程实现的报表完全可以使用FineReport本身的功能实现. 当你需要的表名,查询条件等均未知的时候,使用"动态参 ...
- hash算法 (hashmap 实现原理)
Hash ,一般翻译做" 散列" ,也有直接音译为" 哈希" 的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出 ...
- Spark算子--countByKey
转载请标明出处http://www.cnblogs.com/haozhengfei/p/1633ffc63e2c925e930adadc9528c830.html countByKey--Actio ...