2014-10-07 39 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

相关问题