2014-10-07 38 views
3

install.packages()如果無法安裝包(例如,如果不可用),將返回警告;例如:如果無法安裝R軟件包,我該如何使install.packages返回錯誤?

install.packages("notapackage") 

編輯:我想拋出一個錯誤,不管包不能安裝,而不僅僅是一個丟失的包裹的這個例子情況的原因)。

我在腳本運行install.packages命令,我想它引發相應的錯誤與退出執行。我在install.packages內部看不到一個明顯的選項來處理這種行爲。有什麼建議麼?

+0

首先檢查'available.packages()'?函數(...){ifelse(任何(grepl( 「警告」,capture.output(install.packages(...)))),1,0 - 文本匹配'install.package2 < – 2014-10-07 20:22:58

+0

可怕可怕可怕溶液)}''和'cake.installer(「cake」); cake.installer(「lmtest」)' – Vlo 2014-10-07 20:28:36

+0

@Vlo是的,我的想法也是。也許我們可以用'withCallingHandlers()'做得更好...... – cboettig 2014-10-07 20:37:47

回答

0

擴大在快速評論:

R> AP <- available.packages() 
R> "notapackage" %in% AP[,1]  # expected to yield FALSE 
[1] FALSE 
R> "digest" %in% AP[,1]   # whereas this should be TRUE 
[1] TRUE 
R> 
+0

我選了一個不好的小例子。我們希望解決方案在install.packages()失敗時引發錯誤,無論原因如何(無法編譯等),而不僅僅是缺少包的情況。 – cboettig 2014-10-07 20:28:55

+0

請參閱'help(install.packages)'並檢查返回值。依我看,他們答應你一個無條件'NULL'所以我擔心_No mas_除非你搶佔(我認爲)或重寫... – 2014-10-07 20:31:04

+0

正確,'install.packages'返回NULL不管。我不遵循我如何搶佔軟件包安裝失敗的各種原因... – cboettig 2014-10-07 20:34:20

4

R函數WithCallingHandlers()讓我們去處理有明確定義函數的任何警告。例如,如果R收到任何警告(並將警告消息作爲錯誤消息返回),則可以告訴R停止。

withCallingHandlers(install.packages("notapackage"), 
        warning = function(w) stop(w)) 

我猜測,這是不理想的,因爲大概一個包可以成功安裝,但仍然拋出一個警告;但沒有遇到過這種情況。正如Dirk所說,測試require的軟件包可能更穩健。

+0

這可能會做到。在缺少的包中,我們得到了'stop()',接下來的問題是一個失敗的構建(缺少頭文件......)是否會被捕獲。 – 2014-10-07 20:57:06

+0

是的,丟失標題等都會引發一般性警告:例如'警告消息: 在install.packages( 「XML」): 安裝包 'XML' 的發生有非零退出status'上'install.packages( 「XML」)''上的debian-R-base'其缺少'libxml2' – cboettig 2014-10-07 21:02:58

相關問題