从try、tryCatch或类似函数返回逻辑值TRUE/FALSE?

3
在R中,是否有一个函数可以在出现错误时返回“FALSE”,否则返回“TRUE”?或者类似这样的东西,还是我需要通过评估类似于ifelse(class(try(stop())) == "try-error", FALSE, TRUE)来创建自己的函数?
2个回答

8

我有时需要这样做。我的方法是使用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

4

你肯定不想使用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"会成功,但有时会返回多个类,这种情况下就不会成功。


1
测试中最多只能有一个项目。 - IRTFM
1
@Abe - ifelse(逻辑向量, 当向量为TRUE时替换的值, 当向量为FALSE时替换的值) 相对于 if(单一条件==TRUE) {执行某些操作} else {执行其他操作} - thelatemail
@thelatemail 懂了...那么将向量转换为单个条件是否更合适,使用 any(如 @Roman 的答案中所做的)? - Abe
使用inherits()函数可以实现同样的目标。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接