如有必要,在R中自动安装软件包列表

9bfwbjaz  于 2023-02-27  发布在  其他
关注(0)|答案(4)|浏览(134)

我想在R脚本的开头检查是否安装了所需的包,如果没有,就安装它们。
我想使用类似下面的内容:

RequiredPackages <- c("stockPortfolio","quadprog")
for (i in RequiredPackages) { #Installs packages if not yet installed
    if (!require(i)) install.packages(i)
}

然而,这给了我错误信息,因为R试图安装一个名为'i'的包。

if (!require(i)) install.packages(get(i))

...在相关行中,我仍然收到错误消息。
有人知道怎么解决吗?

tf7tbtn2

tf7tbtn21#

虽然@Thomas的答案已经解决了这个问题,但我想指出pacman可能是一个更好但简单的选择:
首次安装pacman:

install.packages("pacman")

然后加载软件包。Pacman会检查每个软件包是否已经安装,如果没有,会自动安装。

pacman::p_load("stockPortfolio","quadprog")

就是这样。

  • 相关链接:*
  1. pacman GitHub page
  2. Introduction to pacman
f1tvaqid

f1tvaqid2#

我觉得这很接近你想要的:

requiredPackages <- c("stockPortfolio","quadprog")
for (package in requiredPackages) { #Installs packages if not yet installed
if (!requireNamespace(package, quietly = TRUE))
install.packages(package)
}

HERErequireNamespace函数的源代码和说明。

hi3rlvi2

hi3rlvi23#

默认情况下,libraryrequire都在第一个参数上使用非标准求值。这使得它们很难在编程中使用。但是,它们都接受character.only参数(默认值为FALSE),可以使用该参数来获得结果:

RequiredPackages <- c("stockPortfolio","quadprog")
for (i in RequiredPackages) { #Installs packages if not yet installed
    if (!require(i, character.only = TRUE)) install.packages(i)
}
clj7thdc

clj7thdc4#

到目前为止,我已经编写了以下函数(并将其放入一个包中),它基本上完成了@托马斯和@federico提出的任务:

SPLoadPackages<-function(packages){
    for(fP in packages){
        eval(parse(text="if(!require("%_%fP%_%")) install.packages('"%_%fP%_%"')"))
        eval(parse(text="library("%_%fP%_%")"))
    }
}

相关问题