【发布时间】:2015-05-29 10:19:44
【问题描述】:
我访问了question,了解如何实现一个脚本来检查是否加载了正确的包,但是当我尝试修改代码以执行其他操作时,它们都不起作用,例如,加载列出的包如果它已经安装或获取软件包列表,而不必一一输入。
我尝试过的:
# works for checking whether individual packages are installed and if not
# installing them (wrapped in a function to save space)
chinst <- function(x){if(x %in% rownames(installed.packages())==FALSE) {install.packages(x)}}
chinst("car")
# (NOT functioning) can't add an `library()` to the if function
chinst2 <- function(x){if(x %in% rownames(installed.packages())==FALSE) {if(x %in% rownames(available.packages())==FALSE) {paste(x,"is not a valid package name via CRAN")} else {install.packages(x)}} else {library(x)}}
# (NOT Functioning) check a list of packages rather than individual ones
pkgs <- list("MCMCpack", "BMA", "coda")
lapply(X = pkgs, FUN = chinst)
【问题讨论】:
-
通常使用
if(!require(package)) install.packages(package)进行这样的操作,因为require()会返回一个逻辑结果来判断包是否加载成功 -
当你最终使用 5-10 个包时,重复编写它来安装然后加载包似乎过分了。如果我能让一个函数正常工作,我可以将它添加到我的 R 配置文件中,并使用一两行代码。
-
不管怎样,在
if()语句中包含%in%也可能会导致问题(警告和意外结果)。为了安全起见,您可以使用any(),然后使用if(any(x %in% y)) lapply(x[x %in% y], library, character.only = TRUE)之类的东西或类似的东西。我很确定你也可以在install.packages()中使用任意长度的向量