【问题标题】:tryCatch in R not working properlyR中的tryCatch无法正常工作
【发布时间】:2013-10-16 03:47:10
【问题描述】:

我有以下 R 代码:

tryCatch( {pre_symbol=read.table(file=filePre,header=FALSE,sep=",")}
         , error = function(e) {loadError = TRUE} )

当输入文件 (filePre) 为空时,tryCatch 不会将全局变量 loadError 设置为 TRUE。这会在我的代码中产生问题(当 loadError==false 时执行的代码假定 filePre 不为空)tryCatch 应该阻止的问题。但是,当我删除 tryCatch 语句并尝试通过 read.Table 加载时,出现错误

read.table 中的错误(file = filePre, header = FALSE, sep = ",") : no 输入中可用的行

在这种情况下是预期的。我不知道为什么这不起作用。它适用于我集中的大多数其他文件。

【问题讨论】:

  • 将您的问题命名为“XXX 无法正常工作”是一种不好的形式,这意味着 XXX 中存在错误。最好写“不明白我对 XXX 做错了什么”

标签: r try-catch


【解决方案1】:

你应该在这里使用全局赋值运算符<<-,例如:

loadError = FALSE
toto <- function(){

  tryCatch(stop("dummy error"),error=function(e)loadError <<- TRUE)
}

> toto()
> loadError
[1] TRUE

【讨论】:

  • 这解决了问题!然而,所有这些帖子都很有帮助!谢谢!
【解决方案2】:

避免使用“全局分配”的一些替代方法(除非在特定情况下,它并不是真正的全局):

使用存在:

tryCatch({
    stop("Error")
    pre_symbol <- "blah"
}, error = function(e) {
    print(e)
})

if(exists("pre_symbol")){
    print(pre_symbol)
}

使用 NULL:

pre_symbol <- NULL
tryCatch({
    stop("Error")
    pre_symbol <- "blah"
}, error = function(e) {
    print(e)
})

if(!is.null(pre_symbol)){
    print(pre_symbol)
}

使用选项:

options(myLoadError=FALSE)
tryCatch({
    stop("Error")
    pre_symbol <- "blah"
}, error = function(e) {
    print(e)
    options(myLoadError=TRUE)
})

if(!isTRUE(getOption("myLoadError"))){
    print(pre_symbol)
}

使用环境:

loadErrors <- new.env(parent=emptyenv())
tryCatch({
    stop("Error")
    pre_symbol <- "blah"
}, error = function(e) {
    print(e)
    loadErrors[["pre_symbol"]] <- TRUE
})

if(!isTRUE(loadErrors[["pre_symbol"]])){
    print(pre_symbol)
}

我个人倾向于使用 NULL 模式。

【讨论】:

    【解决方案3】:

    虽然&lt;&lt;- 确实有效,但与GlobalEnv 混在一起并不总是一个好主意。为什么不检查错误并在出现问题时更新loadError - 在匿名函数之外,而不会在顶级环境中搞砸一些事情:

    loadError <- inherits(tryCatch({
        pre_symbol = read.table(file = filePre, header = FALSE, sep = ",")
    }, error = function(e) e), 'error')
    

    【讨论】:

    • 根据文档,它不是明确全局的:The operators &lt;&lt;- and -&gt;&gt; are normally only used in functions, and cause a search to made through parent environments for an existing definition of the variable being assigned 所以错误关闭中的myLoadError &lt;&lt;- TRUE 更像assign("myLoadError",TRUE,pos=1)
    【解决方案4】:

    你可以只使用 try() 函数:

    pre_symbol <- try(read.table(file=filePre,header=FALSE,sep=","))
    loadError <- is(pre_symbol, 'try-error')
    

    【讨论】:

    • 代码中有一个类型(我猜)。应该是:loadError &lt;- is(pre_symbol, 'try-error')
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 2021-10-31
    • 2017-01-12
    • 1970-01-01
    • 2020-06-30
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多