27

我正在尝试编写一组函数来检查丢失的 R 包,并在必要时安装它们。在 StackOverflow 上有一些很好的代码可以做到这一点:从这里开始

我想让这些函数尽可能地静音,特别是因为 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 = TRUEin 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 用户列表,以便从核心开发团队获得解释。根据suppressMessages(suppressWarnings(require(...)))我的经验,解决方法可能不稳定。

4

6 回答 6

23

如果你想让你的require函数非常安静,你可以使用:

suppressMessages(suppressWarnings(require(xyz)))

这使 :

...好吧,没什么:)

于 2013-02-12T14:38:55.743 回答
19

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

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

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

于 2015-10-13T16:41:05.147 回答
8

最简单的解决方案似乎是

try(library(xyz), silent=TRUE)

require基本上是一个包装器tryCatch(library),所以这只是去掉了一些无关的代码。

于 2014-07-24T02:41:36.273 回答
1

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

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

但这很危险..我认为您需要更改警告消息的颜色。

于 2013-02-12T14:39:03.810 回答
1
PkgNames <- c("forecast", "tseries", "ggplot2", "qcc", "ggmap","corrgram",
              "effects", "Hmisc", "plyr", "reshape")
invisible(suppressMessages(suppressWarnings(lapply(PkgNames, require, character.only = T))))
于 2014-07-23T19:19:16.973 回答
0

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

requireNamespacewithquietly=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。毫无疑问,有些软件包根本没有帮助。

于 2021-05-23T04:08:36.287 回答