2015-09-06 153 views
1

我是R新手,我已经花了一段时间在Web上的脚本示例,我碰到一个脚本,有一堆require(<package>)行。而不是写install.packages(<package>),我修改剧本这样:R控制台与R脚本环境的区别;错误与installed.packages()

package_names <- c('caret', 
       'readr', 
       'xgboost', 
       'ggplot2', 
       'R.utils', 
       'gridExtra', 
       'lubridate', 
       'data.table', 
       'Matrix', 
       'plyr', 
       'Hmisc', 
       'maps', 
       'maptools', 
       'sp', 
       'corrplot') 
for (package_name in package_names){ 
    if (!package_name %in% rownames(installed.packages())) 
     install.packages(package_name) 

    eval(parse(text=sprintf("require(%s)",package_name))) 
} 

因此,它会试图安装的软件包,如果没有安装它,需要它。但是在执行此为脚本,导致下面的误差R演播室:

Error in contrib.url(repos, "source") : 
    trying to use CRAN without setting a mirror 
Calls: <Anonymous> ... withVisible -> eval -> eval -> install.packages -> contrib.url 

我不显式调用contrib.url所以我真的不知道从哪里开始。

但是我试着复制粘贴这些确切的行,并在命令行R Studio解释器会话(repl)中运行它们,然后运行并完美地安装/更新所有这些软件包。

这引出了一个问题:命令行会话和导致此错误的脚本有什么区别?

+0

你是如何运行脚本的? –

+0

我相信** pacman **包的'p_load'函数会为您处理所有这些,包括cran回购集。它会使代码更加简洁和可读。 –

+2

顺便说一下,通过使用'install.packages(setdiff(package_names,rownames(installed.packages())))'而不是循环,可以将代码制作成两行更具惯用的R代码。要用变量调用'require'(更好:'library' - 不需要'require'!),使用'require(var,character.only = TRUE)'。你可以使用'invisible(Map(library,package_names,character.only = TRUE))'一次完成所有的包。两个陈述。 –

回答

4

设置CRAN镜脚本,由getCRANmirror()返回的选项,例如当中,

chooseCRANmirror(ind=1) 

正如@KonradRudolph建议,更习惯的方法可能是安装任何遗漏的需求,然后require()所有包。

chooseCRANmirror(ind=1) 
needed = package_names[!package_names %in% rownames(installed.packages())] 
install.packages(needed) 
ok = sapply(package_names, require, character.only=TRUE) 
if (!all(ok)) { 
    bad = paste(package_names[!ok], collapse=", ") 
    stop("failed to 'require' packages: ", bad) 
}