由于工作需要,今天花了一上午的时间研究了一下KEGG的API,虽然走了不少弯路,但最终还是圆满完成任务。下面我将复盘整个过程,和大家分享在使用KEGG API中的经历和体会。
事情的起因是这样的,我手上有一个KEGG的ID列表,我的任务是找到这些ID所对应的gene以及它们所在的pathway。
我已经很多年没有用过KEGG了,刚拿到这些ID的时候也是一头雾水。经过一番搜索(也要感谢小伙伴们的指点),我在KEGG的网站上找到了这些ID以及我想要的gene和pathway信息。
我一开始想抓这个网页,解析HTML文件,但是发现这些信息是javascript程序动态产生的,此路不通。在这个网页的右上方有一个【Download htext】的链接,下载后得到的是一个后缀名为 .keg 的文本文件,看上去和网页上的内容一样。
如果这是个xml或者是json格式的文件,故事就到此为止了,因为有很多现成的工具可以拿来解析它。但是这个文件的格式比较特殊,得自己动手写程序来提取,比较麻烦。有没有更简单一点的方法呢?
身为一名Rapper,不找找Bioconductor的包怎么行呢?果然有一个叫KEGGREST的包可以方便的调用KEGG的API,这样问题就变得简单多了。
https://www.bioconductor.org/packages/release/bioc/vignettes/KEGGREST/inst/doc/KEGGREST-vignette.html
但是,我高兴的太早了!在使用KEGGREST的过程中,不断有 Timeout was reached 的错误产生,真的让人抓狂!
于是我再回过头来研究KEGGREST的原理。它实际上是先通过KEGG API下载一个文本文件,然后再去解析。而我现在就卡在了调用API这一步。
弄清楚原理之后,我调整了自己的策略:首先用外部工具来调用API,将文本文件保存下来,然后用KEGGREST内部的parser来解析这些文件。
具体做法如下:
-
在不借助KEGGREST提供的keggGet函数的情况下,我得先搞清楚KEGG API 的URL格式是怎样的。
http://www.kegg.jp/kegg/docs/keggapi.html
我需要的operation是get,dbentries就是ID号,所以API的URL就可以写成:http://rest.kegg.jp/get/K00001 -
然后用curl来调用API,由于我有3000多个ID,所以需要生成一个脚本来批量下载:
bash脚本的内容:
运行该脚本,下载过程很顺利。我发现每次下载前总是要停大概15秒左右,也许这就是前面的方法总是Timeout的原因吧。具体原因就不深究了,只要能达到我的目的就行。
-
接下来要弄清楚KEGGREST包中的哪个函数负责文本解析。通过查看keggGet函数的代码,我觉得应该是.flatFileParser函数
-
目标明确后,我们就来下载KEGGREST的源代码(Package Source)
https://www.bioconductor.org/packages/release/bioc/html/KEGGREST.html
将KEGGREST_1.14.0.tar.gz解压后,我在它的R目录下发现了一个parsers.R的文件,我们要找的函数就在里面。 -
最后,我们用下面的代码来解析下载好的文本文件
需要注意的是,这里不要再写library(KEGGREST),直接source它的2个文件就可以了。.flatFileParser返回的是一个长度为1的list,list里面又嵌套了一个list。
-
最终的结果如下,任务圆满完成!
我的方法不一定是最好的,欢迎广大Rapper提供更好的方法和大家分享。