我正在尝试编写一组函数来检查缺少的R包,并在必要时安装它们。在StackOverflow上有一些很好的代码:start here。
我想让函数尽可能保持沉默,特别是因为R甚至以红色墨水返回成功的消息。因此,我尝试将quietly = TRUE
参数传递给library
和require
。
但是,这些选项似乎永远不会起作用:
# 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(...)))
解决方法可能不稳定。
答案 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)
这是一个老问题,但为了其他寻求答案的人的利益:
requireNamespace
和 quietly=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))))