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

Fr.*_*Fr. 22 r

我正在尝试编写一组函数来检查缺少的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’
Run Code Online (Sandbox Code Playgroud)

我如何能够require默默地失败,以及我没有得到关于该quietly选项的内容?

文件说:

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

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


加.同样的问题适用quiet = TRUEinstall.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)
Run Code Online (Sandbox Code Playgroud)

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

jub*_*uba 20

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

suppressMessages(suppressWarnings(require(xyz)))
Run Code Online (Sandbox Code Playgroud)

这使 :

......好吧,没有:)

  • 这就是我到目前为止所做的事情.然而,它可能是不稳定的:我已经让RStudio在运行它时多次中止我的R会话,特别是通过`lapply`结构. (4认同)
  • @Fr.始终检查RStudio之外的那种错误,以确保它不仅仅是特定于该特定IDE. (2认同)

zwo*_*wol 16

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

suppressPackageStartupMessages({
    require(this)
    require(that)
    ...
})
Run Code Online (Sandbox Code Playgroud)

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


Hon*_*Ooi 8

最简单的解决方案似乎是

try(library(xyz), silent=TRUE)
Run Code Online (Sandbox Code Playgroud)

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