tryCatch没有捕获RStudio中install.packages产生的错误

时间:2014-11-17 14:39:53

标签: r try-catch packages rstudio

请考虑以下用法:

tryCatch(log("a"), error = function(e) NULL)
#NULL

现在我试图做的基本相同,但是以更复杂的方式。我有两个网络存储库,如果由于某种原因第一个不可用,我想从第二个安装软件包。以下是我的表现方式:

pkg_location <- c("file://main_repo", "file://extra_repo")
lapply(pkg_location, function(repo)
{
  tryCatch(install.packages("my-cool-package", 
                            contriburl = repo, dependencies = TRUE),
           error = function(e) NULL)
})

我期待NULL的列表。但是,错误不会被抑制:

Installing package into ‘...’
(as ‘lib’ is unspecified)
Warning in install.packages :
  cannot open compressed file '//extra_repo/PACKAGES', 
    probable reason 'No such file or directory'
Error in install.packages : cannot open the connection
[[1]]
NULL

[[2]]
NULL

似乎install.packages忽略了机制。这怎么可能,为什么会发生这种情况?我该如何处理这个问题呢?

这里sessionInfo,可能值得注意的是我正在运行RStudio 0.98.977。

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.1.2

3 个答案:

答案 0 :(得分:2)

RStudio没有执行正常的install.packages,而是做了自己的事情:

查看RStudio中的代码:

> install.packages
function (...) 
.rs.callAs(name, hook, original, ...)
<environment: 0x3e4b478>
> .rs.callAs
function (name, f, ...) 
{
    withCallingHandlers(tryCatch(f(...), error = function(e) {
        cat("Error in ", name, " : ", e$message, "\n", sep = "")
    }), warning = function(w) {
        cat("Warning in ", name, " :\n  ", w$message, "\n", sep = "")
        invokeRestart("muffleWarning")
    })
}
<environment: 0x3bafa38>
奇怪的代码,它回忆起自己...... 我期待某处.Primitive()

> sum
function (..., na.rm = FALSE)  .Primitive("sum")

但这是一个丑陋的RStudio黑客。如果你看一下普通R中的install.packages,你会得到:

  

head(install.packages)#真的很长:P
  1个函数(pkgs,lib,repos = getOption(&#34; repos&#34;),contriburl = contrib.url(repos,   2 type),method,available = NULL,destdir = NULL,dependencies = NA,
  3 type = getOption(&#34; pkgType&#34;),configure.args = getOption(&#34; configure.args&#34;),
  4 configure.vars = getOption(&#34; configure.vars&#34;),clean = FALSE,
  5 Ncpus = getOption(&#34; Ncpus&#34;,1L),verbose = getOption(&#34;详细&#34;),
  6 libs_only = FALSE,INSTALL_opts,quiet = FALSE,keep_outputs = FALSE,
  ....

答案 1 :(得分:1)

我打算建议关闭作为偏离主题,因为这是一个RStudio问题。基本上,tryCatch正在捕获错误,但RStudio的错误处理程序仍会打印错误。因此,您获得返回值的原因是:

[[1]]
NULL

[[2]]
NULL

这意味着tryCatch有效。 RStudio只是奇怪地打印出来的错误。

答案 2 :(得分:1)

使用命名空间调用:

utils::install.packages()