yuu_nkjm blog
2010-09-06(Mon) [長年日記] 編集
[R言語] Rでアサーション
Javaでプログラミングをする時にassertをよく使う.しかし,R言語にはassert構文や関数がなさそうだった.単体テスト用スクリプト@つれづれ:R言語Tipsで自前のassert関数が公開されているのを見かけたので,ちょっと改造してみた.
assert <- function( condition, msg="") { if ( is.na( condition ) ) { cat("-------------------------------------\n") cat( "assert fail, condition is na\n\t") cat("msg: \t") cat(msg) cat("\n") traceback() cat("-------------------------------------\n") return(FALSE) } if ( condition == FALSE ) { cat("-------------------------------------\n") cat("assert fail:\n\t", sep="") print(substitute(condition)) cat("\t\t is expected TRUE but it is FALSE\n", sep="" ) cat("msg: \t") eval(expression(msg)) cat("\n") traceback() cat("-------------------------------------\n") return(FALSE) } return(TRUE) }
↓こんな使い方を想定.第一引数が判定条件,第二引数が判定条件がFALSEだったときに評価される式.
式は一つしかかけないけど,ブロック{}を使えば複数書ける.
assert(hoge!=0) #hogeは0でない. assert(hoge!=0, print(hoge)) #hogeは0でない.0だったら,print(hoge) assert(hoge!=0, recover()) #recoverも便利 assert(hoge!=0, {print(hoge);recover()}) #ブロックを使う if(!assert(hoge!=0)){ #返り値を使ってif文で分岐 print(hoge) recover() }
tracebackの挙動がよくわからん.思うところは色々あるが,ひとまず使ってみよう.
hoge <- 5 assert(hoge==0, print(hoge)) ------------------------------------- assert fail: hoge == 0 is expected TRUE but it is FALSE msg: [1] 5 No traceback available -------------------------------------