在R中是否可以执行以下操作:
execute cmd1
if cmd1 generates error, proceed to:
execute cmd2
由于
答案 0 :(得分:2)
try
和/或tryCatch
可能对您有用。考虑下面的超简单玩具示例:
# Our function just returns it's input as long as input is not negative otherwise an error is generated
f <- function(n) {
if( n < 0 )
stop("need positive integer")
return(n)
}
# Our alternative function to run if we get an error from the first function
f2 <- function(n) return( cat( paste( "You have a negative number which is" , n ) ) )
# Now we try to run it with `try`:
if( class( try( f(-1) , silent = TRUE ) ) == "try-error" )
f2(-1)
#You have a negative number which is -1
# And using the sophisticated `tryCatch()`
tryCatch( f(-1) , finally = f2(-1) )
#Error in f(-1) : need positive integer
#You have a negative number which is -1
try()
的返回值是表达式的值,如果它的计算结果没有错误,否则是class
"try-error"
的对象。在第一个示例中,我们只是检查是否使用比较try
的返回值的类生成了错误,并在生成错误时执行f2()
。
请注意,有很多方法可以解决这个问题,我当然不会提倡这些方法中的最佳方法,但它们应该是您了解错误处理的有用起点。
答案 1 :(得分:1)
试试这个,错误是try块中的错误信息。
tryCatch(stop(),
error=function(err){
print(1)
print(err)
})
答案 2 :(得分:1)
根据您的使用情况,即使简单的布尔运算符短路也可能就足够了。即,如果您的函数可以返回TRUE
以指示无错误而FALSE
指示错误,那么您可以使用||
仅评估RHS操作数(如果LHS操作数)的事实评估为FALSE
。
> doAwesomeStuff <- function() {cat("OMG, I'm awesome! <falls flat on face>\n"); FALSE}
> okDoNormalStuff <- function() {cat("OMG, I'm OK! :-)\n"); TRUE}
> doAwesomeStuff() || okDoNormalStuff()
OMG, I'm awesome! <falls flat on face>
OMG, I'm OK! :-)
[1] TRUE
但是如果doAwesomeStuff()有效,
> doAwesomeStuff <- function() {cat("OMG, I'm awesome!\n"); TRUE}
> doAwesomeStuff() || okDoNormalStuff()
OMG, I'm awesome!
[1] TRUE