在R包版本依赖有误、新版R包存在bug或者新版R包函数重大更新导致自己代码报错等情况下,一个可选的解决方案是安装特定的旧版本的R包来解决。
R包的两大分发位置是CRAN和bioconductor,CRAN的R包是本文讨论的重点,bioconductor包的版本依赖比较严格,因此本文暂不分析bioconductor包的旧版本安装。有关于GitHub上面的R包,由于其本质上只是一个源码R包,因此其和CRAN的安装基本上并无不同,本文只会略有所提。
CRAN是The Comprehensive R Archive Network,它是分发各版本R及R包的地方。
如果需要查找旧版本的R包,需要先找到此R包在CRAN上的主页地址,方法如下:


由于是为了下载R包,因此重点关注R包主页中的Downloads那里,里面共有四个选项:

如下图所示就是ROCR包的旧版本源码的位置。

除了一步一步的按照上述步骤寻找R包主页,一个更方便的方式是:
方法1:搜索引擎直接搜索CRAN+包名即可,一般第一个就是。
方法2:构造R包的CRAN网址:https://cran.r-project.org/web/packages/{包名}/index.html
比如car包:https://cran.r-project.org/web/packages/car/index.html
MASS包:https://cran.r-project.org/web/packages/MASS/index.html

R中安装R包的函数是install.packages函数,一般使用都是install.packages('包名'),比如安装ROCR包就是install.packages('ROCR')。install.packages会自动从CRAN下载ROCR包的最新源码,并执行编译安装。
此外,它也支持其他自定义的操作:
网址安装
同样是从网络上安装,但是是指定的R包的网址而不是包名,比如:
在ROCR包主页上的Package source处找到右侧的链接,右击 -> 复制链接地址,拿到R包的源码文件位置。即可以如下方式安装ROCR包:
install.packages("https://cran.r-project.org/src/contrib/ROCR_1.0-11.tar.gz")
当然从网址、本地文件/文件夹安装R包时都是需要指定repos=NULL的,也就是上一句应该是:
install.packages("https://cran.r-project.org/src/contrib/ROCR_1.0-11.tar.gz", repos = NULL)
不过install.packages函数是可以自动推断出来这个参数的,它会自动加上,所以此处可以省略。如果主动加上的话,那么稳健性更好。
执行之后,这个R包就安装上了,最新版本1.0-11:
# 注意此处是installed.packages,不是install.packages
installed.packages()["ROCR", c("Package", "Version")]
# Package Version
# "ROCR" "1.0-11"
本地安装
也可以将R源码文件下载下来,然后使用install.packages安装。之所以需要下载R源码安装,主要是因为可以将R包解压后然后调试、修改部分R源码文件,一般用于修bug的环节。
将上文提到的‘Old sources’里面找到ROCR包的旧版本源码,下载ROCR_1.0-7.tar.gz(https://cran.r-project.org/src/contrib/Archive/ROCR/ROCR_1.0-7.tar.gz)的源码。
然后执行本地安装即可:
# 情形1. 直接安装R包文件
install.packages("ROCR_1.0-7.tar.gz")
# 情形2. 如果是解压后的R包,且解压到了当前工作目录,解压后文件夹名是ROCR
# 必须加上repos=NULL, 因为无法推断出ROCR是一个文件夹
install.packages("ROCR", repos = NULL, type = "source")
# 查看R包版本
installed.packages()["ROCR", c("Package", "Version")]
# Package Version
# "ROCR" "1.0-7"
注意,在windowns及部分版本的mac平台上,install.packages往往会尝试优先安装二进制R包而不是源码R包,如果安装时有报错这些信息,可以添加参数type='source',也就是说从url或者本地安装一个R源码包的最稳健形式是:
install.packages("R包url/R包文件路径/解压后的R包文件夹路径", repos = NULL, type = "source")
如果是本地安装,则依然使用install.packages函数是没有问题的。但是更方便的方式是调用devtools包的函数devtools::install_github安装即可。