【问题标题】:Using tryCatch and source使用 tryCatch 和源
【发布时间】:2011-07-10 06:57:07
【问题描述】:

假设我有两个 R 文件:correct.Rbroken.R。使用tryCatch 检查错误的最佳方法是什么?

目前,我有

> x = tryCatch(source("broken.R"), error=function(e) e)
> x
 <simpleError in source("broken.R"): test.R:2:0: unexpected end of input
  1: x = {
     ^>
> y = tryCatch(source("correct.R"), error=function(e) e)
> y
 $value
 [1] 5

 $visible
 [1] FALSE

但是,我构建tryCatch 的方式意味着我必须询问xy 对象以确定是否存在错误。

有更好的方法吗?


问题来自于教学。 100 名学生上传他们的 R 脚本,我运行这些脚本。说得好,我打算创建一个简单的函数来确定它们的函数来源是否正确。它只需要返回 TRUE 或 FALSE。

【问题讨论】:

  • 请注意,tryCatch 只会报告它遇到的第一个错误。

标签: r error-handling try-catch


【解决方案1】:

也许我没有考虑到这一点,但由于您只是在寻找布尔值,您可以测试$visible 的存在:

y <- tryCatch(source("broken.R"), error=function(e) e)
works <- !is.null(y$visible) #y$visible would be null if there were an error

这能解决您正在寻找的问题吗?您可以将其包装在一个循环中(或使用 lapply),例如:

for(i in 1:length(students)) {
  works[i] <- !is.null(tryCatch(source(student_submissions[i]), error=function(e) e)$visible)
}

【讨论】:

  • 这就是我正在做的,只是看起来很笨重。我想我正在寻找一个is.error 命令。
  • er,使用来自 try 的对象,即不是 tryCatch
【解决方案2】:

试试这个:

> tryCatch(stop("foo"), error = function(e) {
+ cat(e$message, "\n")
+ FALSE
+ })
foo 
[1] FALSE

或者,您应该考虑 Hadley 的 testthat 包:

> expect_that(stop("foo"), is_a("numeric"))
Error in is.vector(X) : foo

【讨论】:

    【解决方案3】:

    为了扩展 mdsumner 的观点,这是一个简单的实现。

    sources_correctly <- function(file)
    {
      fn <- try(source(file))
      !inherits((fn, "try-error"))
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2015-06-01
      相关资源
      最近更新 更多