注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Puriney's Notes

Puriney=purine+Y, my Wonderland

 
 
 

日志

 
 

[qwert]或0或1 —— 也许Perl真的不如Python/R  

2013-10-02 10:52:47|  分类: QWERT |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我仅从 “数组定位” 角度来比较Perl Python R三种语言,从中我感觉到三种语言在数据处理上的细微差别,也似乎觉得,在生物信息领域,也许Perl真的不如Python和R。 

扯一扯在生物信息工具世界里,“数组定位”的两套基本体系:

1. 以0为原点。典型的文件格式布局有BAM、BED等。
2. 以1为原点。典型的文件格式布局有SAM、GFF等。

举个例子,在表示“ATGC”这长度为4的序列时,二者的表示形式:
0-based:[0,4),坐标即0,1,2,3
1-based:[1,4],坐标即1,2,3,4

虽然这点讲起来很傻缺,但这点若是忽略了,位置点弄错了,所有分析将全会是扯淡。统计跨可变剪切位点的reads时尤其如此。0-based和1-based没啥谁优谁劣,只是在加减长度时要注意是否加1而已。不过Perl/Python/R在这点上倒真的有差别,故有此篇扯淡。

回到例子,现在要求: 逐个字符地打印“ATGC”该序列的每一个碱基。 

我先直接把三种语言的做法递上来,同时把每一步逐步打印到屏幕上。
1. Perl,一般来说,会这么做:

#!/usr/bin/perl -w
use strict;
my @array = ("a","t","g","c");
for (my $i = 0; $i < @array; $i++) {
print $i . "\t" . $array[$i] . "\n" ;
}

Perl用到的是for循环(拒绝用foreach)。
输出:

0 a
1 t
2 g
3 c

2. Python,普遍的写法:

#!/usr/bin/python
array = ["a","t","g","c"]
for i in range(0,len(array)):
print i

print array[i]

Python有range函数可以使用。
输出:

0
a
1
t
2
g
3
c

3. R,可以这么写:

#! /usr/bin/Rscript
array <- c("a","t","g","c")
for ( i in 1:length(array)){
print (i)
print (array[i])
}

输出:

[1] 1
[1] "a"
[1] 2
[1] "t"
[1] 3
[1] "g"
[1] 4
[1] "c"

到这里,你应该可以体会到我的感觉:python就是0-based,R就是1-based,而Perl天生是0-based,但实际操作中其实二者皆可。褒义地来说,很聪明,贬义地来说,真的太随便。

大体来说,三者都是在循环:都是从起点,逐步循环到终点。

Python的原点是0,故我说它天生都是0-based。R的原点是1,故它天生是1-based。实际操作中,它们也严格各自履行着信条。Python里的range或者xrange,最后的终点,记录值为数组的长度,同时按着0-based信条,该点是不应该包含在内的,即:[0,长度)。类似的,R起点为1,最终的终点为数组的长度,同时该点包含在内,即[1,长度]。以上这些,都写在了代码里。它们彻头彻尾都贯彻着自己的坐标体系。

至于Perl,就多样一些。
Perl,和python一样起点是0,故天生是0-based。但是它并没有类似range这样的函数。自己写for循环。

上文中给出的Perl代码,风格是彻头彻尾0-based。Perl很聪明,@array直接就记录着数组的长度,完全不用象Python需要len函数或者R那样需要length函数。不过,for (my $i = 0; $i < @array; $i++) 的for如此的风格,总是被初学Perl时我的强迫症吐槽,我不喜欢小于号,我需要等于号!于是我不小心就扯淡的错误:for (my $i = 0; $i <= @array; $i++),这样会报错,指针超过了数组的范围。

这个世界,也许神经病不止一个,于是上述例子中,Perl还有一种写法就是:

for (my $i = 0; $i <= $#array; $i++) {
print $i . "\t" . $array[$i] . "\n" ;
}

# 因为 $#array = @array - 1

不过如此一来,就成了起点为0、信条是1-based的循环混搭风格了。

仅就0-based或是1-based,Python和R很自然地与生物信息呼应着。

Perl真的太聪明,太随便。

--
最后,该例子中,这样的Python代码:

#!/usr/bin/python
array = ["a","t","g","c"]
for i in xrange(0,len(array)):
print "\t".join([str(i),array[i]])


以及这样的R代码:

#! /usr/bin/Rscript
array <- c("a","t","g","c")
sapply(array,print)

或许会减少一点点对我的吐槽。

--
我个人抵触Python,原因很奇葩。Perl的命名颇有珍珠的通感,logo要么是蚌壳要么是骆驼,我都可以接受;R的命名可能来自于作者名字的首字母,logo虽然一个土鳖R字母(以至于推荐用rstats作为关键词来谷歌搜索),但通感C语言也好S语言也罢,至少一种经典土鳖的感觉;至于Python,虽然号称是因为作者喜欢的一部剧的主角,但世界上清一色都是用的大蟒蛇为其logo。
  评论这张
 
阅读(664)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017