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函数就报错
如下所示:
非常的诡异,首先它居然在没有赋值的情况下就把我的输入变量给修改了,不可思议!
实在是太不安全了!!!
略微思考了一下,猜测应该是这个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包,优先级关系很烦人,如果每个函数都需要显式调用,我以前的代码都会很麻烦!