說到R包的安裝簡直是個噩夢,為什么R包這么難裝呢?我大膽分析一下,歡迎批評指正:
生態混亂
R在統計圈的盛行決定了R包的開發人員基本上做統計的,這些開發者開發的包水平層次不齊。有 時候一個簡單的功能卻要依賴一個非常復雜的包,嚴重增加的包的負擔。
很多包含有C代碼需要編譯
一方面需要安裝編譯器,另一方面有編譯失敗的風險。
錯誤提示不友好
例如,biomaRt安裝說明說,可以使用R 3.6安裝:

然而,錯誤提示卻是:

安裝失敗的原因當然不是R版本的問題,這里卻誤導性的提示是R版本的問題。如果這個時候能給出 安裝失敗的真正原因,也能幫助用戶快速定位問題。然而,事與愿違。
總結一下,R包難以安裝的根本原因是生態混亂,錯誤提示不友好是阻礙用戶找到失敗原因的根本原因。
解決辦法
我們總希望解決問題的時候有什么終極辦法,然而對于R包的安裝卻是很難找到此類辦法。下面我列舉一下 我平時解決問題的基本思路,不能保證徹底解決問題,但是大多數的問題是能夠解決的。
使用anaconda安裝
這個方法最有希望成為終極解決辦法。anaconda組織會把R包統一管理,你只需要使用conda install就行。 例如,你想要安裝ArrayExpress,執行如下命令安裝:
conda install -c bioconda bioconductor-arrayexpress
然而,事情不是總是難么順利,也是很容易安裝失敗。
失敗原因1:版本沖突
anaconda有三個重要的channel與R相關。
r
conda-forge
bioconda
其中bioconda里面都是bioconductor包,這個里面包。r、conda-forge里面都有一些R包, 這就很容易導致安裝包時各個channel里面的包互相沖突。
失敗原因2: conda install一下,地動山搖
不知道biconda的打包策略,有的時候安裝一個R包卻要更新我的Python。往往安裝的時候我都心驚膽戰, 生怕有啥不好的影響,一見到有更新Python的R包,往往只能采取其他方式安裝。
下載二進制包安裝
這個方法針對有些R包有C代碼需要編譯安裝,卻又不想安裝編譯器,或者沒有編譯成功的情況。方法是去CRAN官網, 找到你要安裝的包,選擇你要安裝平臺的二進制包下載:

然后本地安裝:
install.packages("/path/to/download/file.zip", repos = NULL)
這里要注意,如果是本地安裝需要指定repos = NULL。為啥要單獨指定,R不會判斷是本地文件路徑還是包名嗎? 這個問題我也很疑惑。
源碼安裝
這個安裝方法是沒有辦法的辦法。設想我就是這個包的開發者,我會怎么開發這個包呢?
寫代碼
裝依賴
…
那么我下載這個包的源碼,把這個包的依賴依次裝上,然后再裝這個包不是水到渠成嗎?
這個方法最為麻煩,然而卻是能解決大部分的情況。大體步驟是這樣的:
下載源碼
解壓,進入項目根目錄
像這個包的開發者一樣,使用devtools::install()進行安裝
如果安裝失敗,打開DESCRIPTION文件
逐一安裝項目依賴,DESCRIPTION文件中Depends、Imports兩項是項目依賴,例如:

這個包依賴Biobase、XML、oligo、limma。
6. 如果依賴包依舊安裝錯誤,則下載依賴包的源碼進行源碼安裝(這是一個遞歸),直到所有依賴安裝成功, 這個時候再運行devtools::install()就水到渠成了。