R控制台与R脚本环境的区别; instal.packages()出错

时间:2015-09-06 19:17:17

标签: r cran

我是R的新手,我花了一段时间在网络上加入示例脚本,我遇到了一堆有require(<package>)行的脚本。我没有写install.packages(<package>),而是修改了脚本:

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 studio中执行此作为脚本会导致以下错误:

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)中运行它们,然后运行并安装/更新所有这些包完美无缺。

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

1 个答案:

答案 0 :(得分: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)
}