【问题标题】:Error when I add library() to if function将 library() 添加到 if 函数时出错
【发布时间】: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() 中使用任意长度的向量

标签: r function


【解决方案1】:

我认为这样的事情可能对你有用。不要使用 pkgs 的包名称列表,而是使用字符向量。

fun <- function(pkgs) {
    ## check for installed packages
    have <- pkgs %in% rownames(installed.packages())
    ## if we don't have them all, install the ones we don't have
    if(!all(have)) install.packages(pkgs[!have]) 
    ## load them all
    invisible(lapply(pkgs, require, character.only = TRUE))
}

fun(c("MCMCpack", "BMA", "coda"))

请注意,根据您的.libPaths() 的设置,使用.packages(TRUE) 通常会返回与rownames(installed.packages()) 相同的结果,并且速度要快得多。

还要注意,对我来说,rownames(installed.packages()) 并不可靠。见this Q&A

【讨论】:

  • 检查是否安装了一个包,如果没有安装则加载它,如果是,则加载它。多鸟一石。
  • 如果我删除了 else 之后的内容,它将不再有“库”,并且如果它已经安装,也不会加载包。正确的?如果软件包已经安装,我只想加载它。
  • 不错的答案,虽然乍一看我真的被Negate(any)(have)弄糊涂了!
  • 我会说是的,它看起来更容易阅读(但这可能非常主观..)
  • 另外,如果您可以将其重写为其他人使用的功能,我认为这将是一个更有用的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多