python和r语言对比_Python和R语言之分析对比
Python和R语言之分析对比
在Python中调用R或在R中调用Python,为什么是“和”而不是“或”?
在互联网sphere中有关于R语言与Python语言的文章,在搜索结果的前十名中仅发现两篇文献探讨了两者的协同优势。这并非难以理解:就其发展历史而言,两种语言自始至终都展现出明显的优势与劣势。尽管它们最初被分开发展是由于学科背景的原因:统计学家倾向于采用R语言而程序贯开发者则主要采用Python。然而随着数据科学家群体规模不断扩大这种区分逐渐变得不那么明显。
数据科学家可以被描述为一种人:他们是最擅长统计学的软件工程师,并且同时又是最擅长编程的统计学家。 – josh_wills在推特上这样说道。
鉴于这两种语言各自分别提供了丰富的独特库资源,在善于运用这两种语言的数据科学家间的竞争日益激烈。
Python与R的对比
在以下领域中,Python 比R 更有优势:
网络爬虫和数据抓取:尽管R中的rvest已经简化了网页抓取,在功能上相对较为基础。相比之下,在功能上更为丰富。
数据库连接:然而R提供了大量用于连接至数据库的选项;而Python的sqlachemy只需引入一个库即可实现所有数据库连接功能;且在实际应用中表现出很强的适应性
而在以下领域中,R语言比Python更有优势:
统计分析选项:虽然Python的SciPy、Pandas以及statsmodels整合了丰富的一套统计分析工具包,并且R语言专门针对统计分析的应用而发展而来,在这一领域构建了更为专业的解决方案。
交互式图像或控制板:Bokeh, Plotly和Intuixtics近期都实现了Python图形功能在Web浏览器中的应用,然而,以Shiny为例,R语言中的Shiny控制面板运行速度更快,并且通常所需的代码量较少.
此外,在数据科学团队目前拥有的广泛技能集合中存在多种专业技能组合的可能性下,则任何应用程序所选择的编程语言都可能会用到以往的知识和经验。对于一些特定的应用程序而言——尤其是原型设计与开发应用程序的过程中——当个人或团队使用他们已知的技术栈时往往能够加快开发速度。
纯文本 的“Air Gap(网闸)”策略
基于完全断开的网络物理连接,在不依赖任何网络传输介质的情况下达成合法信息的共享。本文采用通过纯文本文件的形式,在两种语言之间建立代码共享机制——译者注
使用纯文本作为两种语言之间的物理隔离,你需要按如下步骤进行。
从命令行中重构你的R和Python脚本,并接受命令行参数。
输出共享数据到公共文件格式。
在一种语言中执行另一种语言,按要求传递参数。
优势:
最简单的方法,通常最快
可以轻松查看中间输出结果
已有常见文件格式,如: CSV , JSON , YAML的解析器
劣势:
需要事先商定一个共同的模式或文件格式
如果流程变长的话,难以管理中间输出结果和路径
如果数据量变大,本地磁盘读写将成为瓶颈
命令行脚本
在Windows或Linux终端下的命令行界面下运行R和Python脚本类似于其他类似的脚本。要运行的命令被分解成以下部分:
在Windows或Linux终端下的命令行界面下运行R和Python脚本类似于其他类似的脚本。要运行的命令被分解成以下部分:
其中
是可执行的命令 (R代码中是 Rscript, Python代码中是Python)
表示运行脚本所在的完整或相对的文件路径。特别指出,在路径名包含空格的情况下,整个文件路径必须用双引号括起来。
这种空格分隔的参数列表用于解析当前脚本。请注意以下几点:这些参数不能作为字符串传递。
例如,打开一个终端环境并运行R脚本,命令如下:
Rscript path/to/myscript.R arg1 arg2 arg3
请注意以下问题:
对于使用Rscript和Python的命令而言,它们应当位于你的当前目录中执行;如果不在,则需要提供完整的文件路径
包含空格符的路径名称会在Windows系统中引发问题;因此,在这种情况下,请确保将这些路径名称用双引号括起来以避免混淆
R语言中访问命令行参数
在示例中提到的
#获取命令行参数
myArgs
#myArgs是所有参数的特征向量
print(myArgs) print(class(myArgs))
当trailingOnly被指定为TRUE时, myArgs向量仅限于那些直接添加到命令行参数的项. 而当默认值设为FALSE时, myArgs会包括其他参数,例如刚被执行的脚本路径.
Python语言中访问命令行参数
通过下面的命令行执行Python脚本:
python path/to/myscript.py arg1 arg2 arg3
为了在Python脚本中获取参数信息,请访问sys模块中的arg1、arg2和arg3参数。请注意,默认情况下sys.argv将包含所有被传递给当前脚本运行时的所有命令行参数。其中argv属性代表了当前运行时所接收的所有命令行参数列表。表中的第一个元素即为该脚本文件的实际路径信息。
myscript.py
import sys
获取命令行参数
my_args = sys.argv
my_args 是一个列表,其中的第一个元素是执行的脚本
print(type(my_args))
print(my_args)
如果你仅仅希望保留传递到脚本中的参数列表中除了第一个元素以外的所有后续参数的话,则可以使用列表切片操作来实现这一目标
使用切片,选择除第一个以外的所有元素
my_args = sys.argv[1:]
复习一下前面提到的R语言示例中提到的所有参数必须作为字符串形式输入。
将输出结果写入文件
在R与Python之间传输数据时,请问共有多少种中间文件可以选择?就常规的纯文本文件而言,在存储表格数据方面表现突出的是CSV格式。而当涉及可变长度字段、复杂嵌套结构或其他非结构化形式的数据(如元数据)时,则建议采用JSON或YAML这两种格式。
这些包括广泛使用的数据序列化表示形式,在R和Python中已经开发出了高效的解析工具。
在R语言中推荐下面的程序包:
对于CSV文件,使用readr
对于JSON文件,使用jsonlite
对于YAML文件,使用yaml
Python中推荐:
对于CSV文件,使用csv
对于JSON文件,使用json
对于YAML文件,使用PyYAML
csv 类和json类是Python官方提供的标准库文件,在Python内部直接可用;而PyYAML必须通过额外安装相应的软件包才能使用。所有R相关程序包都需要预先进行安装。
总结
R 和Python之间的数据传递可以通过单一传递途径进行:
使用命令行传递参数
使用常见的结构化文本文件传递数据
但是,在特定情况下(如涉及大量数据处理),通常会将原始的文本数据临时存储在一个本地的临时文件中以供后续操作使用)。这种做法虽然简单但却存在明显的缺陷:一方面操作过程繁琐容易出错;另一方面会导致系统资源占用过高进而影响整体性能表现。随后我们将探讨如何直接在R和Python环境中进行操作,并且避免将大量数据加载到内存中。
命令行执行和执行子进程
为了深入理解和掌握子进程的工作机制,在命令行运行Python或R程序时应着重关注更多细节信息。当执行以下命令时, 系统启动了一个新的Python脚本文件进行处理
在执行过程中,在标准输出与标准错误中被输出的数据会被返回至控制台进行显示。最常见的实现途径包括Python内置的print函数以及R语言中的cat函数与print函数。这些功能负责将给定的字符串写入标准输出流。当脚本执行完成时,相应的Python进程会随之关闭。
在这种方式下执行命令行脚本是有益的;但若要用这种方法依次处理多个连续而相互独立的任务,则会显得繁琐且容易出错;然而这将允许一个Python或R程序直接启动另一个类似的任务;这样有优点在于可以让一个Python父进程启动一个R中的子进程来运行特定的脚本;一旦该R脚本完成运行,则其输出结果会被父进程中接收而非通过标准输出传递;这种做法避免了手动逐个单独执行命令行操作的步骤
实例
为了比较不同进程中事件触发的方式,在本研究中我们采用两个简单的例子进行说明:一是Python调用R语言进行数据处理;二是R语言调用Python脚本进行可视化展示。我们人为降低了每个案例中分析结果的影响程度,并非旨在强调某一种编程语言的优势或劣势;而是为了突出机器如何实现这个过程的技术细节。
R脚本范例
我们简单的R脚本例子要从命令行获取一系列数字并返回最大值。
max.R
获取命令行参数
myArgs
转换成数字类型
nums = as.numeric(myArgs)
cat将把结果写入标准输出流
cat(max(nums))
在Python中执行R脚本
为了实现模块间的协作运行,在程序设计中我们选择将子进程模块作为基础单元,并将其纳入到整个系统的管理架构之中。为此目的我们需要以一种更加系统的方式对各个模块之间的关系进行规划和优化配置。在这个过程中我们会采用模块间通信机制来确保各组件之间的信息传递能够高效可靠地完成任务。在实际操作中我们计划通过调用R脚本的方式执行相应的命令并将其标准输出结果进行记录以便后续的数据处理和分析工作能够顺利开展
为了在Python中调用R语言执行max.R脚本, 首先需要构建运行所需的命令行参数. 其在Python中的实现形式是一个由字符串构成的列表, 其中对应的参数设置如下:
[‘’, ‘’, ‘arg1’ , ‘arg2’, ‘arg3’, ‘arg4’]
下面代码是运行在Python中调用R的一个例子:
run_max.py
import subprocess
定义命令和参数
command = ‘Rscript’
path2script = ‘path/to your script/max.R’
args变量的值是一个列表
args = [’11’, ‘3’, ‘9’, ’42’]
#建立子进程命令
cmd = [command, path2script] + args
check_output会执行命令并存储结果
x = subprocess.check_output(cmd, universal_newlines=True)
print(‘The maximum of the numbers is:’, x)
设置参数 universal_newlines=True 使Python将返回的结果视为文本型数据并正确处理Windows和Linux平台上的分隔符。若未设置此参数,则程序会将输出视为单个字节型数据返回;在对这些数据执行任何后续操作前,请确保先解码转换为可读的文本形式。
Python 脚本范例
在我们的简单 Python 脚本中,我们将给定的输入字符串(第一个参数)分解为依据提供的模式设置的多个子串(第二个参数)。接着,这些分解后的结果被一行一行地输出至控制台。
splitstr.py
import sys
获取传入的参数
string = sys.argv[1]
pattern = sys.argv[2]
#执行分割
ans = string.split(pattern)
#把所产生的元素列表合成一个新命令行
分割字符串并打印
print(‘\n’.join(ans))
在R中调用Python
在运行R程序时,在处理子进程方面推荐采用R中的system2函数来进行操作,并最终获得处理结果。内建的系统功能存在跨平台一致性问题,因此直接调用这些功能可能会遇到限制。
设置要执行的任务类似于上面提到的Python示例。然而, system2希望其命令根据特定参数进行分解.此外,这些参数必须始终指向当前正在运行脚本的位置.
最后一个问题可能源于R脚本路径名称中存在空格。
最简单的解决办法是对整个路径名加上双引号,
然后将其用单引号括起来,
从而让R能够保留这些双引号。
下面的代码中,给出在R 中执行 Python 脚本的实例。
run_splitstr.R
command = “python”
#注意在字符串中的单引号和双引号(如果路径名中有空格,这是必须的)
path2script='”path/to your script/splitstr.py”‘
设置args成向量
string = “3523462—12413415—4577678—7967956—5456439”
pattern = “—”
args = c(string, pattern)
把脚本路径加入,成为第一个arg参数
allArgs = c(path2script, args)
output = system2(command, args=allArgs, stdout=TRUE)
print(paste(“The Substrings are:\n”, output))
为了生成标准输出中的特征向量(每个元素单独一行),将stdout参数设置为TRUE时需在system2中明确指定该参数的值;否则系统只会返回一个结束标志。若stdout被设置为TRUE,则程序会将终止信息保存到一个名为"状态"的属性字段中。
总结
借助于子进程的交互机制,在一个应用中实现Python与R的集成是可行的。以上述方式为基础设计的应用能够使得父进程中嵌入独立运行的任务处理逻辑,并以标准输出的形式接收处理结果。
完 谢谢观看
