2017-05-23 8 views
0

私はたくさんのモデルを実行しており、いくつかのエラーを投げています。すべての出力とすべてのエラーを保存したいしかし、tryCatchhere)からの私の出席者は、警告を返すか、または警告がなければ返すコードを作成しました。ここでは、コードは次のとおりです。オブジェクトを作成し、オブジェクトと警告を保持するtryCatchを書く方法

DT <- iris 
str(DT) 
DT$binary <- as.numeric(DT$Petal.Width>1) 
DT$dummy <- as.numeric(as.numeric(DT$Species)>2) 

警告を持つモデルは警告を返しますが、環境中のロジットモデルを保持しません:警告なし

test <- tryCatch(
logit1 <- glm(binary~Sepal.Length+dummy,data = DT, family = binomial(link = 'logit')), 
warning = function(w) { conditionMessage(w) }) 

モデルは、環境にロジットオブジェクトを作成しますしかし、これをオブジェクトとして保存すると、全体のログ出力になります。

test <- tryCatch(
logit2 <- glm(binary~Sepal.Length+Sepal.Width,data = DT, family = binomial(link = 'logit')), 
warning = function(w) { conditionMessage(w) }) 

でもありません(私は推測している条件が満たされていないと意味があります)tryCatchかのように。私は、警告がない場合は警告を表示し、名前付きのロジットモデルを作成するかどうかにかかわらず、警告メッセージが表示されたら警告を表示します。どういうわけか、tryCatchはこれには非常に適していないようです。理想的には、私はロジットを実行して、それが可能ならば警告メッセージを保存します。ここで

答えて

1

は、その時点であなたがやりたいことができるように、どのように

  • 機能によって提起されているインターセプト警告やエラーを示すいくつかのコードである(例えばメッセージを保存)、および
  • は、エラーが発生しなかった場合は関数の結果を返し、エラーが発生した場合は何かを返します。

これはまさにあなたの望むものではありませんが、あなたの問題を解決するためにそれを適用できるはずです。

g <- function(x) { 
    errorMessage <- character() 
    warningMessages <- character() 

    result <- withCallingHandlers(
      tryCatch(
        f(x), 
        error = function(e) { 
         # Code here will be run if f raises an error. 
         errorMessage <<- conditionMessage(e) 
         # To edit the error message and raise the error, use this: 
         # stop("some extra text\n", conditionMessage(e)) 
         return(200) # this will be assigned to result 
        } 
      ), 
      warning = function(w) { 
       # Code here will be run if f raises a warning. 
       warningMessages <<- append(warningMessages, conditionMessage(w)) 
       # To edit the warning message and raise the warning, use this: 
       # warning("some extra text\n", conditionMessage(w)) 
       # The following line is needed at the end to transfer control 
       # back to the appropriate place in f: 
       invokeRestart("muffleWarning") 
      } 
    ) 

    if (length(warningMessages) > 0) 
     cat("WARNINGS:\n", paste(warningMessages, collapse="\n"), "\n", sep="") 
    if (length(errorMessage) > 0) 
     cat("ERROR:\n", paste(errorMessage, collapse="\n"), "\n", sep="") 
    return(result) 
} 

ここにある:ここでは

f <- function(x) { 
    if (x %% 2 == 0) warning("warning number 1") 
    if (x %% 3 == 0) warning("warning number 2") 
    if (x %% 5 == 0) stop("error number 1") 
    if (x %% 7 == 0) stop("error number 2") 
    return(100) 
} 

はそれが提起警告やエラーを周り fをラップし、傍受機能である:ここではまず

は時々警告やエラーを発生させる機能です警告またはエラーがない場合はどうなりますか:

> g(11) 
[1] 100 
> g(35) 
ERROR: 
error number 1 
[1] 200 

と警告とエラーの両方があります:

> g(42) 
WARNINGS: 
warning number 1 
warning number 2 
ERROR: 
error number 2 
[1] 200 

そうそこにあなたがいるときにエラーが発生した場合には

> g(6) 
WARNINGS: 
warning number 1 
warning number 2 
[1] 100 

:警告が、エラーがあります。ご覧のとおり、gのコードはわかりにくいです。 invokeRestart("muffleWarnings")のようなものはうまく文書化されていません。

+0

本当によかったよ、ありがとう!私は来週、それを通り過ぎます。 –

関連する問題