移至主內容

試處理R常見的non-zero exit status問題

Submitted by 肥貓 on

前言

三年前在修讀多變量統計課程的時候,剛好也是我往Ubuntu遷移的第一年,首要的挑戰也就是在Ubuntu上建立R的作業環境。當時其中一個最困擾我的問題,是安裝特定套件時,老是出現non-zero exit status的錯誤訊息,然後那個套件不能用,我就愣在那裡不知如何是好,情急時只好拿鄰近的Windows電腦,重建一個臨時的R環境救火。這樣對於平台轉移計畫來說當然不是好事,若因此貽誤作業或工作更是一場災難。

直到論文寫完服役前,我才有餘裕稍微靜下心來研究這問題該怎麼辦,當時剛好在學習用R做地形圖的時候,透過爬文和實作稍微學到解決方法,但當下還沒想到要寫下來。退役後我在學習使用Debian,重建R環境的時候剛好又遇到同樣的問題,用了一年前的方法排障,經驗大致上成功。於是我就把它寫下來存參:

探討成因:

我還沒有力氣搞清楚所謂的non-zero exit status到底是怎麼回事,從非技術人的角度,似乎只知道就是某個套件無法安裝,害我不能工作。不過在這裡也沒那麼重要。

實測發現可能成因除了使用的R版本過舊,造成有些套件不再被支援之外(不過這通常不是主要的原因);主要是電腦未安裝特定相依套件所造成。這裡借用吳紹裳老師的比喻,你做牛肉麵不是有麵就好,還要有高湯和牛肉等配料才行。R在Ubuntu或Debian的運作有件必須特別留意的事情是,許多相依套件其實本身不是R的套件,也不是在R的環境裡運作,而是直接和你的作業系統共享一些函式庫/套件,所以你的系統欠缺某些套件的時候,R就會陷入類似汽車空有引擎,卻沒有輪子時的窘態。

此時就要從錯誤訊息去看,還缺哪些Linux套件。請注意我把Linux套件標粗體,沒搞清楚這句話的含意,你可能會在安裝一些R誤以為不支援或該版本沒有,但是其實裝了Linux相關套件就能解決的問題上鬼打牆。

實例研討

光看我洋洋灑灑寫一堆,不如找個實際例子展示。通常我安裝完R第一件事,就是安裝社會科學領域常用的sjPlot套件。但是在Debian上初試啼聲立刻踢到鐵板。

圖中錯誤訊息意思大概是說,有個叫做nloptr的套件安裝失敗。後面還有lme4、emmeans、sjstats等套件也出了問題。就像鐵路即使只有一小段遇到落石,全線就要停駛一樣。任何程式的相依套件,即使是最小的套件出了問題,整個程式就是動不了。此時我的直覺是,好如果單獨安裝某套件,系統說R 4.0版已經不支援不能安裝(但我這裡沒附圖),要去4.1或更新版才有,那升級到(目前已知最新版)4.2總行了吧?殊不知又遇到類似問題。

這時候就要留意我剛才說的,有時候可能不是R版本的問題,而是少了特定Linux套件(如上圖藍色方框處所示)。如R此時告訴你,系統少了CMake套件,並請你用apt/yum...(個別linux發行版的套件安裝工具)安裝該套件。(操作情形類似下圖,雖然圖面上安裝的套件和上面寫的不一樣,但做法大同小異)

照上述步驟安裝完套件之後,再回到R的console,重複上一步驟(如install.package(sjPlot);快速鍵是↑)。實做後發現還是會出現好幾次錯誤訊息,但是每次系統都會告訴你還缺什麼東西,此時不要氣餒,按照提示把套件補安裝起來即可。

(PTT的)笨版上你並不孤單,我也是折騰了一個小時,畫面下緣才終於出現"DONE"的字眼(不過圖中我當時在處理的其實不是sjPlot,不過狀況類似)。此時稍微可以體會,工程師在電腦前面尖叫到底是怎麼回事。從RStudio畫面右上角的歷史紀錄(history)可以看到,我也是重複了好幾次同樣的安裝步驟(然後也被系統打臉了N-1次),才把這東西修好。不過如果花點小力氣可以把原本看似無解的問題搞定,還算是值得啦。