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
-------------------------------------
[ツッコミを入れる]