繁荣背后何尝没有隐患

R语言的繁荣是毋庸置疑的,至少在科研界的地位蒸蒸日上,极大的占领了原来属于各种商业绘图软件的市场。不仅仅是在于其免费的属性,更重要的是随心所欲地自由定制。

但是参与的玩家多了之后,也会出现一些冲突。最近在运行一些三五年前的代码报错了,引发了我的思考。

### 正常的ID转换并不会报错

有时候我会使用 clusterProfiler 包的函数 bitr进行ID转换,代码如下:

> library(org.Mm.eg.db)
> library(clusterProfiler)
> gene <- bitr(rownames(need_DEG), fromType = "SYMBOL",
+ toType = "ENTREZID",
+ OrgDb = org.Mm.eg.db)
'select()' returned 1:1 mapping between keys and columns
Warning message:
In bitr(rownames(need_DEG), fromType = "SYMBOL", toType = "ENTREZID", :
 19.2% of input gene IDs are fail to map...

但是五年前我是不用clusterProfiler 包的,之前的代码是select函数

现在select函数就报错

如下所示:

image-20201112203109436

非常的诡异,首先它居然在没有赋值的情况下就把我的输入变量给修改了,不可思议!

实在是太不安全了!!!

略微思考了一下,猜测应该是这个select函数名字太大众了,所以在很多包里面都有,出现了冲突!

搜索看看select函数来自于哪里

可以看到优先级最高多的是dplyr包:

Help on topic 'select' was found in the following packages:

Subset columns using their names and types
(in package dplyr in library )
Ridge Regression
(in package MASS in library )
Objects exported from other packages
(in package tidygraph in library )
Objects exported from other packages
(in package clusterProfiler in library )
AnnotationDb objects and their progeny, methods etc.
(in package AnnotationDbi in library )

dplyr包设计的有问题啊,都不复制就修改了变量。鄙视它

我加上了select函数真正的来源

代码虽然复杂了一点:

library(org.Mm.eg.db)
gene_up=as.character(na.omit(AnnotationDbi::select(org.Mm.eg.db,keys = gene_up,columns = 'ENTREZID',keytype = 'SYMBOL')[,2]))
gene_down=as.character(na.omit(AnnotationDbi::select(org.Mm.eg.db,keys = gene_down,columns = 'ENTREZID',keytype = 'SYMBOL')[,2]))
head(gene_up)

但是这次就不报错了。

教程的隐患?

现在每次分析数据,都引入一大波R包,优先级关系很烦人,如果每个函数都需要显式调用,我以前的代码都会很麻烦!

Comments are closed.