2013-02-12 358 views
18

我想编写一组函数来检查丢失的R包,并在必要时安装它们。在StackOverflow中有一些很好的代码可以做到这一点:start here什么时候'quietly = TRUE'实际上在require()函数中工作?

我想使功能尽可能地保持沉默,特别是因为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,则不会打印确认打包的消息,并且如果打包加载失败,通常不会打印错误/警告。

但在我个人的经验中,在我看来“最经常”应该是“几乎从不”。我会高兴地听到你的经验。理由:编码功能帮助学生。


Add。同样的问题适用于install.packages()中的quiet = TRUE。它只会杀死进度条,但不会杀死下载的“已下载的二进制包”消息(以黑色打印,即!),即使它对中位数用户没有用处。


Add。在这种情况下,可能会感兴趣的人,至今代码:

## 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

对于“最经常”的+1应该是“几乎从不”! – agstudy 2013-02-12 14:33:51

+1

您可能想要阅读'require'和'library'的源代码,以确切了解'quietly'的作用。不幸的是,这些功能是混乱的意大利面代码。另请阅读'install.packages'的源代码来了解复杂程度(将文件解压缩到一个目录中),您可以创建一个简单的过程。 – hadley 2013-02-13 13:01:32

+1

我已经阅读了'require'的源代码:这是很多嵌套的条件。 'quietly'参数杀死额外的错误信息,但不会抑制'Loading ...'消息。学生发现它很麻烦,特别是在红墨水中。 R的特质之一。我最喜欢的是'install.packages'最后传递的信息,可能是'cat':“下载的包现在处于(临时和难以理解的文件夹路径)”。 – 2013-02-14 05:58:15

回答

6

最简单的方法似乎是

try(library(xyz), silent=TRUE) 

require基本上是围绕tryCatch(library)的包装,所以这只是削减了一些多余的代码。

18

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

suppressMessages(suppressWarnings(require(xyz))) 

其中给出:

...好了,没有什么:)

+2

这就是我到现在为止所做的。但是,它可能会变得不稳定:在运行时,我已经让RStudio放弃了我的R会话,特别是通过'lapply'结构。 – 2013-02-12 14:42:49

+2

@Fr。总是检查RStudio之外的那种错误,以确保它不是特定于特定IDE的错误。 – joran 2013-02-12 15:27:18

+0

我在RStudio之外检查过它,它在R64中很稳定。 – 2013-02-12 15:31:02

1

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

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

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

+0

这确实是危险的,不值得推荐,虽然我同意它的工作原理。但对我来说,这太黑客 - 几乎和将警告文本设置为背景颜色一样。 – 2013-02-12 14:44:10

+0

@Fr。我想你想隐藏这个为你的没有技术用户..我试图找到一个选项来更改警告信息为绿色例如.. – agstudy 2013-02-12 14:47:06

+0

上帝与你的运气。出于某种原因,'message()'和'warning()'的打印方式相同。只有用cat()才能打印中性文字。我不认为这些颜色是硬编码的。 – 2013-02-12 14:50:12

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

我不知道什么时候该加入到语言,但要做到这一点的首选方法时下

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

这zorches“载入中...”,约掩蔽符号的投诉,以及其他噪音,但指示实际问题的消息仍然出现(例如,包或依赖项不可用)。

相关问题