【问题标题】:tryCatch not catching error produced by install.packages within RStudiotryCatch 未捕获 RStudio 中的 install.packages 产生的错误
【发布时间】:2015-01-14 12:11:14
【问题描述】:

考虑以下用法:

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

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

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

【问题讨论】:

  • 它为我捕获了错误。您使用的是哪个版本的 R?
  • 请重新启动并包含sessionInfo()
  • @RobertKrzyzanowski 添加了sessionInfo 并再次运行新的会话,还是一样。
  • 它也忽略了suppressMessages()suppressWarnings()。我认为这与它不是原生 R 函数有关
  • 这个问题似乎是题外话,因为它是关于 RStudio 打印捕获的错误。

标签: r try-catch packages rstudio


【解决方案1】:

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 hack。如果您在普通 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), 详细 = getOption("verbose"),
6 libs_only = FALSE,INSTALL_opts,安静 = FALSE,keep_outputs = FALSE,
....

【讨论】:

  • 感谢您的提示,这确实是 RStudio 的非本地覆盖。
  • 嗯,是的,如果你在普通 R 中做同样的事情,你会得到不同的东西......想知道为什么需要这个 hack。
  • 所以我想一个解决方案是使用utils::install.packages @tonytonov
  • 这似乎对我有用,但我仍然想知道这次黑客攻击的原因。 (直到那个时候,我会在我的代码中添加一个很好的负面评论,诅咒 rstudio 的......你知道的:))
  • 这里有一点解释herehere
【解决方案2】:

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

[[1]]
NULL

[[2]]
NULL

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

【讨论】:

  • 我已经检查了普通控制台,它按预期工作。从没想过 RStudio 是罪魁祸首。谢谢。
【解决方案3】:

使用命名空间调用:

utils::install.packages()

【讨论】:

    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 2018-05-14
    • 2018-07-15
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多