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 
-------------------------------------

トップ «前月 最新 翌月» 追記 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|