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

Differences of R console vs. R script environment; error with installed.packages()

我是 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) 中,瞧,它 运行 和 installed/updated 所有这些包都完美无缺。

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

在脚本中设置 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)
}