有安装R包的终极方法吗?
说到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
如果依赖包依旧安装错误,则下载依赖包的源码进行
源码安装
(这是一个递归),直到所有依赖安装成功,这个时候再运行devtools::install()
就水到渠成了。