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

tryCatch未捕获RStudio中install.packages产生的错误,r,try-catch,packages,rstudio,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

考虑以下用法:

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)
})
似乎
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

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>
但这是一个丑陋的RStudio黑客。如果查看普通R中的install.packages,您会发现:

head(install.packages)#非常长:p
1函数(pkgs,lib,repos=getOption(“repos”),contriburl=contrib.url(repos, 2类型),方法,可用=NULL,destdir=NULL,依赖项=NA,
3 type=getOption(“pkgType”)、configure.args=getOption(“configure.args”)、
4 configure.vars=getOption(“configure.vars”),clean=FALSE,
5 Ncpus=getOption(“Ncpus”,1L),verbose=getOption(“verbose”),
6 libs_only=FALSE,INSTALL_opts,quiet=FALSE,keep_outputs=FALSE,


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

[[1]]
NULL

[[2]]
NULL

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

使用名称空间调用:

utils::install.packages()

它为我捕获了错误。您使用的是什么版本的R?请重新启动并包括
sessionInfo()
@RobertKrzyzanowski添加的
sessionInfo
,然后再次运行新会话,仍然相同。它还忽略
suppressMessages()
suppressWarnings()
。我认为这与它不是本机R函数有关。这个问题似乎离题了,因为它是关于RStudio打印捕获的错误的。我在普通控制台中检查过,它按预期工作。没想到RStudio是罪魁祸首。谢谢。感谢您的提示,这确实是RStudio的非本机重写。嗯,是的,如果你在普通R中做同样的事情,你会得到一些不同的东西…想知道为什么需要这种黑客行为。所以我想解决办法是使用
utils::install.packages
@tonytonovs,它似乎对我有效,尽管我仍然想知道这种黑客行为的原因。(在那之前,我会在我的代码中添加一条很好的负面评论,诅咒rstudio,因为……你知道:))这里有一些解释和建议
[[1]]
NULL

[[2]]
NULL
utils::install.packages()