「Debug R」为什么我的R包下载速度令人发指的慢?
今天帮一个学员处理R包安装问题,报错信息如下:

错误信息表明,这个是错是因为无法打开URL造成。我原本以为这个问题和R包安装函数"install.packages"函数详解 一样,是因为下载协议导致。但是当我用TeamViewer远程协助时,却发现他用的是服务器,那么就可以直接排除一开始想到的问题。
当然用命令行进行安装时,发现R包的下载地址并非是国内的镜像站点,而是R的官方站点。那么我基本上可以判定这个安装问题是由于没有选择国内镜像站点造成。

于是我熟练的用vim ~/.Rprofile
增加了如下内容, 用于在R启动的时候设置镜像。
#bioconductor
options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/")
#cran
options("repos" = c(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/",
CRANextra = "http://www.stats.ox.ac.uk/pub/RWin"))
当我重新运行install.packages
的时候,却发现依旧是从官方的站点下载。由于我知道install.packages
的repos选项会用getOption("repos")
确定镜像站点,所以我检查下设置

那么问题来了,为什么我明明设置了~/.Rprofile
中的repos, 但是还是用的原来的网址呢?
原因就是,这个R是学员自己通过apt-get
安装而成,这个时候R的配置文件放在/etc/R
下,你如果用ls -l
查看时,会发现和直接编译的结果有一些差别。你可以研究下图,找找哪里不一样。

答案就是,他多出了"Renvrion.site" 和 "Rprofile.site"两个文件,用于更改全局性的配置。其中"Rprofile.site"和R启动时的环境配置有关。内容如下:

这里面的local
函数顾名思义就是创建了一个局部变量,也就是默认创建一个新的空环境,在这里面定义的函数不会外部访问。可以发现,系统默认将CRAN定义为官方镜像,尽管从理论上,R会先读取Rprofile.site
,然后读取~/Rprofile
, 后来的会覆盖前者,但诡异的是我新建的~/.Rprofile
没有顺利覆盖。不过这不影响我解决问题,我只要修改其中的站点就行了。
local({
r <- getOption("repos")
r["CRAN"] <- "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"
options(repos=r)
})
问题顺利解决。
还有一件事情,和主题无关,但是也很重要。当你从3.4.x 升级到3.5.x时,因为Renvrion中设置了R包的存放位置(如下图),那么新R版本的R会读取老版本的R包,因此会出现不兼容问题。所以你需要检查下图中R_LIBS_SITE
中所示的文件夹,删除里面内容,避免不兼容导致的报错。
