考虑以下用法:
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
最佳答案
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) # it is really long :P
1 function (pkgs, lib, repos = getOption("repos"), contriburl = contrib.url(repos, 2 type), method, available = NULL, destdir = NULL, dependencies = 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,
....
关于r - tryCatch 未捕获 RStudio 中 install.packages 产生的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26975111/