数据-R语言-图表-决策-Linux-PythonDebug RR语言问题集锦

「Debug R」为什么你需要保持R包是最新的?

2018-12-30  本文已影响146人  xuzhougeng

今天安装一个最新的R包的时候,提示要对一些依赖包进行更新,我没有管他。结果当我运行以前没有报错的代码时,却出现如下的报错,

报错如下

上面的报错出现在MacOS上,为了找到报错,我用Linux运行相同的代码并没有遇到报错。于是用sessioninfo()对R包版本进行比较。

通过不断的比较,最终将问题定位到XVector上,发现Linux的版本是最新的,而MacOS的版本是旧的。

MacOS Linux

进一步,我发现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

开源软件的一大问题就在于此,新的工具为了不重复造轮子会依赖于已有成熟工具。已有的工具会不断的更新,如果突然有一天,作者把原有函数全改了,同时他居然还不提供的一个缓冲时间段,也就是让旧函数名和新函数名同时并存一段时间,结果你就傻眼了(放心,一个合格的程序员不会这样子瞎搞的)。

最后给两个建议:

上一篇下一篇

猜你喜欢

热点阅读