「Debug R」为什么你需要保持R包是最新的?
今天安装一个最新的R包的时候,提示要对一些依赖包进行更新,我没有管他。结果当我运行以前没有报错的代码时,却出现如下的报错,
报错如下上面的报错出现在MacOS上,为了找到报错,我用Linux运行相同的代码并没有遇到报错。于是用sessioninfo()
对R包版本进行比较。
通过不断的比较,最终将问题定位到XVector
上,发现Linux的版本是最新的,而MacOS的版本是旧的。
进一步,我发现0.20.0版本是来自于Bioconductor 3. 7, 而最新的Bioconductor版本是3.8. 同时今天安装的包也来自于3.8的Bioconductor,因此出现了不兼容的情况,导致报错。
那么问题来了,XVector到底是什么?一直默默无闻的它到底有什么作用呢?我打开了他的帮助文档,仔细阅读了一下,结论如下:
XVector是R语言自带的Vector的强化,它允许"通过地址传值", 而不需要将在内存中新开辟区域将数据拷贝过去进行运算。 这样子的好处就是节约内存,不然你想获取一个非常大的一个向量中的第i到第j个元素,那你就得先开辟一个很大的一个内存空间,然后在进行取值,最后返回区间内的数值,时间花费非常的大。
读完这个函数之后,你会得出一个结论,XVector 是一个基础设施,提供一个XVector类,其他函数建立在它的基础上。应该还有一个更加底层的东西。
于是我又返回去看我加载包时的Warning信息,有一个concatenateObjectes
引起了我的注意。
我通过谷歌搜索,找到了最终的答案,原来是Bioconductor社区把一个底层函数改名了。所以建立在这个底层函数上摩天大厦就瞬间坍塌了。
3.7 3.8开源软件的一大问题就在于此,新的工具为了不重复造轮子会依赖于已有成熟工具。已有的工具会不断的更新,如果突然有一天,作者把原有函数全改了,同时他居然还不提供的一个缓冲时间段,也就是让旧函数名和新函数名同时并存一段时间,结果你就傻眼了(放心,一个合格的程序员不会这样子瞎搞的)。
最后给两个建议:
- 请尽量保证你的R包最新
- 同时请用那些一直在维护的R包