try関数を使用する。try関数の第1引数に実行するコマンドを指定してtry関数を実行すると、エラーが発生した場合には、特殊な戻り値が戻される。
以下は、正則行列ではない行列の逆行列をsolve関数で求めようとした場合の例。
> mx1 <- matrix(1:9, 3, 3)
> mx1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> mx2 <- solve(mx1)
solve.default(mx1) でエラー:
Lapack routine dgesv: システムは正確に特異です: U[3,3] = 0
> r <- try(mx2 <- solve(mx1))
Error in solve.default(mx1) :
Lapack routine dgesv: システムは正確に特異です: U[3,3] = 0
> r <- try(mx2 <- solve(mx1), TRUE)
> mx2
エラー: オブジェクト 'mx2' がありません
> class(r)
[1] "try-error"
> class(r) == "try-error"
[1] TRUE
逆行列が求められなかったため、mx2には何も代入されておらず、try関数の戻り値はtry-errorクラスになる。このtry関数の戻り値を文字列で判定することで、エラーが発生したか否かの判定が行える。
以下はエラーが発生しない例。try関数の戻り値は、指定をしたコマンドの戻り値が代入される。
> mx1 <- matrix(1:4, 2, 2)
> solve(mx1)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> r <- try(mx2 <- solve(mx1), TRUE)
> mx2
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> r
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> class(r)
[1] "matrix"