2013-02-12 356 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「載入中...」,約掩蔽符號的投訴,以及其他噪音,但指示實際問題的消息仍然出現(例如,包或依賴項不可用)。

相關問題