R Language
フォールトトレラント/復元コード
サーチ…
パラメーター
パラメータ | 詳細 |
---|---|
expr | "try part"が正常に完了した場合、 tryCatch は最後に評価された式を返します 。したがって、すべてがうまくいって、条件がない場合(つまり、 警告またはエラー )にreadLines 戻り値が返される実際の値が返されます 。あなたが経由状態に戻り値をexpliciltyする必要はないことに注意してくださいreturn 「してみてください一部」にコードとしては、ラップされていません(警告と下記のエラーのための条件ハンドラのそれとは違って)機能環境をinsided |
警告/エラー/ etc | 明示的に処理するすべての条件に対してハンドラ関数を提供/定義します。 AFAIUでは、それぞれのハンドラ関数の名前がそれぞれの条件のクラスに一致する限り、 あらゆるタイプの条件( 警告とエラーだけでなく、 カスタム条件もsimpleCondition 、 simpleCondition とフレンドを参照)にハンドラを提供できますtryCatch のドキュメントの詳細部分)。 |
最後に | "try part"の式が成功したかどうか、または条件があったかどうかにかかわらず 、最後に実行する必要があるすべてがここにあります。複数の式を実行する場合は、中括弧で囲む必要があります。そうでなければ、 finally = <expression> (つまり、「try part」と同じロジック)と書くことができます。 |
備考
tryCatch
tryCatch
は、条件がない限りexpr
実行に関連する値を返します。警告またはエラーです。その場合、それぞれの条件に対応するハンドラ関数を指定することで、特定の戻り値(例: return(NA)
)を指定することができます( ?tryCatch
引数warning
とerror
参照)。これらはすでに存在する関数ですが、 tryCatch
内で定義することもできます(上記のように)。
ハンドラ関数の特定の戻り値を選択することの意義
「試し部分」にエラーがあった場合にNA
を返すように指定したので、 y
の3番目の要素はNA
です。戻り値としてNULL
を選択した場合、 lapply
はNULL
戻り値を単純に「無視/削除」するため、 y
の長さは3
ではなく2
になりNULL
。また、あなたが経由して明示的な戻り値を指定しない場合はご注意return
、ハンドラ関数が返すNULL
(すなわち、エラーまたは警告状態の場合)。
「望ましくない」警告メッセージ
私たちの3番目の要素ときurls
ベクトルは、当社の機能を打つ、我々は(エラーが発生しているという事実に加えて、次の警告を得るreadLines
最初それが実際のエラーで失敗する前に警告を介した接続を開くことができないと文句を言います):
Warning message:
In file(con, "r") : cannot open file 'I'm no URL': No such file or directory
エラーは警告よりも「勝っている」ので、この特定のケースでは警告に本当に関心がありません。したがって、 readLines
warn = FALSE
を設定warn = FALSE
が、それは効果がないようです。警告を抑制する別の方法は、
suppressWarnings(readLines(con = url))
の代わりに
readLines(con = url, warn = FALSE)
tryCatch()を使用すると、
与えられたURLからHTMLコードを読み込む堅牢なバージョンの関数を定義しています。私たちは、何かが間違っている(エラー)か、それほど計画していない(警告する)状況に対処したいという意味で頑強です。エラーと警告の包括的な用語は条件です
tryCatch
を使用した関数定義
readUrl <- function(url) {
out <- tryCatch(
########################################################
# Try part: define the expression(s) you want to "try" #
########################################################
{
# Just to highlight:
# If you want to use more than one R expression in the "try part"
# then you'll have to use curly brackets.
# Otherwise, just write the single expression you want to try and
message("This is the 'try' part")
readLines(con = url, warn = FALSE)
},
########################################################################
# Condition handler part: define how you want conditions to be handled #
########################################################################
# Handler when a warning occurs:
warning = function(cond) {
message(paste("Reading the URL caused a warning:", url))
message("Here's the original warning message:")
message(cond)
# Choose a return value when such a type of condition occurs
return(NULL)
},
# Handler when an error occurs:
error = function(cond) {
message(paste("This seems to be an invalid URL:", url))
message("Here's the original error message:")
message(cond)
# Choose a return value when such a type of condition occurs
return(NA)
},
###############################################
# Final part: define what should happen AFTER #
# everything has been tried and/or handled #
###############################################
finally = {
message(paste("Processed URL:", url))
message("Some message at the end\n")
}
)
return(out)
}
物事をテストする
1つの要素が有効なURLではないURLのベクトルを定義しましょう
urls <- c(
"http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html",
"http://en.wikipedia.org/wiki/Xz",
"I'm no URL"
)
そして、これを上記で定義した関数への入力として渡します
y <- lapply(urls, readUrl)
# Processed URL: http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
# Some message at the end
#
# Processed URL: http://en.wikipedia.org/wiki/Xz
# Some message at the end
#
# URL does not seem to exist: I'm no URL
# Here's the original error message:
# cannot open the connection
# Processed URL: I'm no URL
# Some message at the end
#
# Warning message:
# In file(con, "r") : cannot open file 'I'm no URL': No such file or directory
アウトプットの調査
length(y)
# [1] 3
head(y[[1]])
# [1] "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"
# [2] "<html><head><title>R: Functions to Manipulate Connections</title>"
# [3] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
# [4] "<link rel=\"stylesheet\" type=\"text/css\" href=\"R.css\">"
# [5] "</head><body>"
# [6] ""
y[[3]]
# [1] NA