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

weixin_34353714發表於2018-12-30

今天安裝一個最新的R包的時候,提示要對一些依賴包進行更新,我沒有管他。結果當我執行以前沒有報錯的程式碼時,卻出現如下的報錯,

2013053-e5d17db9c4eff56e.png
報錯如下

上面的報錯出現在MacOS上,為了找到報錯,我用Linux執行相同的程式碼並沒有遇到報錯。於是用sessioninfo()對R包版本進行比較。

通過不斷的比較,最終將問題定位到XVector上,發現Linux的版本是最新的,而MacOS的版本是舊的。

2013053-4e7fc877f2f150b9.png
MacOS
2013053-5cde3864ba0520dd.png
Linux

進一步,我發現0.20.0版本是來自於Bioconductor 3. 7, 而最新的Bioconductor版本是3.8. 同時今天安裝的包也來自於3.8的Bioconductor,因此出現了不相容的情況,導致報錯。

那麼問題來了,XVector到底是什麼?一直默默無聞的它到底有什麼作用呢?我開啟了他的幫助文件,仔細閱讀了一下,結論如下:

XVector是R語言自帶的Vector的強化,它允許"通過地址傳值", 而不需要將在記憶體中新開闢區域將資料拷貝過去進行運算。 這樣子的好處就是節約記憶體,不然你想獲取一個非常大的一個向量中的第i到第j個元素,那你就得先開闢一個很大的一個記憶體空間,然後在進行取值,最後返回區間內的數值,時間花費非常的大。

讀完這個函式之後,你會得出一個結論,XVector 是一個基礎設施,提供一個XVector類,其他函式建立在它的基礎上。應該還有一個更加底層的東西。

於是我又返回去看我載入包時的Warning資訊,有一個concatenateObjectes引起了我的注意。

2013053-6e1f227e84d58a40.png
更底層的問題

我通過谷歌搜尋,找到了最終的答案,原來是Bioconductor社群把一個底層函式改名了。所以建立在這個底層函式上摩天大廈就瞬間坍塌了。

2013053-2385f491d9a87c23.png
3.7
2013053-49752e50d0581692.png
3.8

開源軟體的一大問題就在於此,新的工具為了不重複造輪子會依賴於已有成熟工具。已有的工具會不斷的更新,如果突然有一天,作者把原有函式全改了,同時他居然還不提供的一個緩衝時間段,也就是讓舊函式名和新函式名同時並存一段時間,結果你就傻眼了(放心,一個合格的程式設計師不會這樣子瞎搞的)。

最後給兩個建議:

  • 請儘量保證你的R包最新
  • 同時請用那些一直在維護的R包

相關文章