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 
-------------------------------------
[ツッコミを入れる]
本日のリンク元
その他のリンク元
検索
- R言語 Assert ×3 / アサーション Java独習 ×1 / アサーション 感想文 ×1 / R言語 assert ×1 / R言語 traceback 削除 ×1 / javaからr言語 ×1 / UWSC Assert ×1 / R assert ×1
 
