最近生信技能树的很多朋友反馈一个GEOquery
的bug
,而且这个错误对初学者来说,是不可能解决的问题,值得分享一下!(2018-11-27 计)
就是昨天推文末尾的小测试: GEOquery包的getGEO函数总是无法下载肿么办
如下所示,他们下载的表达矩阵,的样本名字本来应该是gsm这样的ID
,结果变成了第一个探针的表达量
。
我当时很诧异,因为没有遇到过这个问题,以为是他们瞎说
,或者说网络问题,但是问的人实在是太多了,我只能重视起来了。
我检查了txt文档,发现没有问题。也检查了R版本
,GEOquery包的版本
,也没有任何问题。
我仔细的把错误的与准确的下载结果对照,如下:
差异很微弱,就是里面的列的解析
问题,所以我猜测应该是GEOquery包里面调用了其它函数的问题。
txt文件的表达矩阵如下:
那就找源代码咯!
源代码解析 首先在谷歌搜索里面找到其源代码路径:
git clone https://github.com/seandavi/GEOquery## 读懂:GEOquery/R/parseGEO.R 文件
查看源代码需要一定的耐心:
查询到下面的代码,是关于表达矩阵列的解析的。
fname='GSE76275_series_matrix.txt.gz' AnnotGPL=FALSE destdir=tempdir() getGPL=TRUE parseCharacteristics=TRUE library (readr ) dat <- read_lines(fname)## get the number of !Series and !Sample lines series_header_row_count <- sum(grepl("^!Series_" , dat)) sample_header_start <- grep("^!Sample_" , dat)[1 ] samples_header_row_count <- sum(grepl("^!Sample_" , dat)) series_table_begin_line = grep("^!series_matrix_table_begin" , dat) ## colClasses <- c('character',rep('numeric',nrow(sampledat))) datamat <- read_tsv(fname,quote='"' , na=c('NA' ,'null' ,'NULL' ,'Null' ), skip = series_table_begin_line, comment = '!series_matrix_table_end' ) datamat[1 :4 ,1 :4 ]
同样的代码我在6台电脑上面都跑了一次,居然是read_tsv
函数的问题,而这个函数来自于readr包,所有准确无误的电脑里面readr都是1.1,而错误的都是1.2版本。
正确的读取信息如下:
同样的反馈我们也在GitHub看到了:https://github.com/tidyverse/readr/issues/925
既然是readr包的问题,我就懒得管了,把该包降级即可解决。
GEOquery包作者已经意识到这个问题了 虽然GitHub有人在readr上面提issue,其实我认为应该是GEOquery应该是做修改,而不是readr去修改,比较GEOquery在依赖readr,不过GEOquery包的作者也接收到了反馈,意识到这个问题了。
## readr1.2.1对skip的处理方式。 ds <- datasource(data, skip = skip + isTRUE(col_names), comment = comment) library(readr) dat <- read_lines(fname) series_table_begin_line = grep("^!series_matrix_table_begin" , dat) datamat <- read_tsv(fname, quote='"' , na=c('NA' ,'null' ,'NULL' ,'Null' ), # somewhere in the past month or so, read_tsv changed # the way it dealt with skip!!! Had to add the -1 to # avoid the problem. skip = series_table_begin_line - 1 , comment = '!series_matrix_table_end' )
也就是说需要在 series_table_begin_line - 1
才可以弥补 readr
的 read_tsv
函数问题。