什么'quietly = TRUE'实际上在require()函数中工作?

时间:2013-02-12 14:29:54

标签: r

我正在尝试编写一组函数来检查缺少的R包,并在必要时安装它们。在StackOverflow上有一些很好的代码:start here

我想让函数尽可能保持沉默,特别是因为R甚至以红色墨水返回成功的消息。因此,我尝试将quietly = TRUE参数传递给libraryrequire

但是,这些选项似乎永远不会起作用:

# attempt to get a silent fail
require(xyz, quietly = TRUE)
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called ‘xyz’

如何让require无声地失败,以及我对quietly选项的看法是什么?

文档说:

  

quietly符合逻辑。如果为TRUE,则不打印确认包装载的消息,并且通常,如果包装加载失败,则不会打印错误/警告。

但在我个人的经历中,“我经常”应该“几乎从不”。我很高兴听到你的经历。理由:编码功能,以帮助学生。


添加。同样的问题适用于quiet = TRUE中的install.packages()。它只会杀死进度条,但不会删除随后出现的“已下载的二进制包都在”消息(黑色,黑色!),即使它对中位用户没用。


添加。如果这可能是任何人都感兴趣的话,到目前为止的代码:

## getPackage(): package loader/installer
getPackage <- function(pkg, load = TRUE, silent = FALSE, repos = "http://cran.us.r-project.org") {
  if(!suppressMessages(suppressWarnings(require(pkg, character.only = TRUE, quietly = TRUE)))) {
    try(install.packages(pkg, repos = repos), silent = TRUE)
  }
  if(load) suppressPackageStartupMessages(library(pkg, character.only = TRUE, quietly = TRUE))
  if(load & !silent) message("Loaded ", pkg)
}

## Not run:
x <- c("ggplot2", "devtools") # etc.
lapply(x, getPackage, silent = TRUE)

我正在考虑放弃在上面的函数中使用quietly的努力,因为它似乎在预期时不起作用。我应该向R用户列表询问这个问题,以便从核心devteam获得解释。根据我的经验,suppressMessages(suppressWarnings(require(...)))解决方法可能不稳定。

6 个答案:

答案 0 :(得分:20)

如果您想让require功能非常安静,可以使用:

suppressMessages(suppressWarnings(require(xyz)))

给出了:

......好吧,没什么:)

答案 1 :(得分:13)

我不确定这是什么时候添加到语言中,但现在这样做的首选方法是

suppressPackageStartupMessages({
    require(this)
    require(that)
    ...
})

此zorches“正在加载...”,有关屏蔽符号和其他噪音的投诉,但仍会显示指示实际问题的消息(例如,包或依赖项不可用)。

答案 2 :(得分:6)

最简单的解决方案似乎是

try(library(xyz), silent=TRUE)

require基本上是tryCatch(library)的包装器,所以这只会删除一些无关的代码。

答案 3 :(得分:1)

一种解决方法是在通话之前和之后设置警告选项...

 options(warn=-1)
 try(require(xyz, quietly = TRUE),silent=TRUE)
 options(warn=0)

但这很危险。我认为你需要的是改变警告信息的颜色。

答案 4 :(得分:0)

这是一个老问题,但为了其他寻求答案的人的利益:

requireNamespacequietly=TRUE 似乎安静地检查软件包是否已安装,因此可以安静地检查:

    > if (requireNamespace("Foobar", quietly = TRUE)) "Found it" else "Not found"
    [1] "Not found"
    > if (requireNamespace("utils", quietly = TRUE)) "Found it" else "Not found"
    [1] "Found it"

所以要解决 OP 的主要问题(粗体问题):

    if (requireNamespace("package", quietly=TRUE)) require("package", quietly=TRUE);

任何噪音都来自加载包。第二个 quietly=TRUE 有所帮助。因此,以上对于丢失的包是无声的,对于某些找到的包是无声的,对于其他的没有 quietly 的情况要少得多。毫无疑问,有些软件包根本无济于事。

答案 5 :(得分:-1)

PkgNames <- c("forecast", "tseries", "ggplot2", "qcc", "ggmap","corrgram",
              "effects", "Hmisc", "plyr", "reshape")
invisible(suppressMessages(suppressWarnings(lapply(PkgNames, require, character.only = T))))