【发布时间】:2013-01-22 23:12:00
【问题描述】:
R 中是否有一个函数在给出错误时返回“FALSE”,否则返回“TRUE”?或者类似的东西,还是我需要通过评估ifelse(class(try(stop())) == "try-error", FALSE, TRUE)之类的东西来创建自己的?
【问题讨论】:
标签: r error-handling try-catch
R 中是否有一个函数在给出错误时返回“FALSE”,否则返回“TRUE”?或者类似的东西,还是我需要通过评估ifelse(class(try(stop())) == "try-error", FALSE, TRUE)之类的东西来创建自己的?
【问题讨论】:
标签: r error-handling try-catch
我不得不偶尔或两次这样做。我所做的是我在这些方面使用了tryCatch。如果您在进行模拟并且有时某些算法不会收敛并产生警告,但您想忽略它,这可能会很方便,因为您不希望您的模拟在超级计算机上的 100 个节点上运行时终止。
> out <- tryCatch(stop("bla"), error = function(e) e)
> any(class(out) == "error")
[1] TRUE
如果进程不间断(没有错误),您将得到 FALSE。
> out <- tryCatch(1:5, error = function(e) e)
> out
[1] 1 2 3 4 5
> any(class(out) == "error")
[1] FALSE
【讨论】:
您肯定不想使用ifelse,但也许这会显示更有效的路线:
> if( inherits(res <- try( stop() ), "try-error") ){ FALSE} else{ res}
Error in try(stop()) :
[1] FALSE
> if( inherits( res <- try( "ppp" ), "try-error") ){ FALSE} else{ res}
[1] "ppp"
现在我想了一下:答案只是inherits(tryres, "try-error"),因为它确实返回了一个逻辑。您决定如何处理它取决于您。确实,多次测试class(tryres)=="tryerror 会成功,但有时返回的类不止一个,在这种情况下不会。
【讨论】:
ifelse(vector of TRUE/FALSE,value to replace when vector==TRUE,value to replace when vector==FALSE) 与 if(single condition==TRUE) {do something} else {do something else} 相比
any 将向量转换为单个条件是否更合适(如answer by @Roman 中所做的那样)?