以下に、日付を文字列として読み込み、日付オブジェクトとして返す関数の例を示します。日付に変換できない文字列を読み取ると、エラーが返されます。
testFunction <- function (date_in) {
return(as.Date(date_in))
}
testFunction("2010-04-06") # this works fine
testFunction("foo") # this returns an error
ここで、lapplyを使用して、この関数を日付のリストに適用します。
dates1 = c("2010-04-06", "2010-04-07", "2010-04-08")
lapply(dates1, testFunction) # this works fine
しかし、2つの適切な日付の途中にある1つの文字列がエラーを返したときにリストに関数を適用したい場合、これに対処する最善の方法は何ですか?
dates2 = c("2010-04-06", "foo", "2010-04-08")
lapply(dates2, testFunction)
そこにtrycatchが必要だと思いますが、lapplyに続行して3番目の日付を読み取るように要求しているときに、「foo」文字列のエラーをキャッチする方法はありますか?
エラーメッセージをスローする可能性のある関数の前後にtryCatch
式を使用します。
testFunction <- function (date_in) {
return(tryCatch(as.Date(date_in), error=function(e) NULL))
}
tryCatch
関数の良いところは、エラーが発生した場合の対処方法を決定できることです(この場合、NULL
を返します)。
> lapply(dates2, testFunction)
[[1]]
[1] "2010-04-06"
[[2]]
NULL
[[3]]
[1] "2010-04-08"
複雑にするのではなく、単純に保つことを試みることができます。
_R> as.Date( c("2010-04-06", "foo", "2010-04-08") ) [1] "2010-04-06" NA "2010-04-08"
_
na.omit()
などを簡単にラップできます。または、NAのインデックスを見つけて、それに応じて初期ベクトルから抽出するか、NAの補集合を使用して、解析された日付、or、or、orを見つけます。すでにすべてここにあります。
testFunction()
に何かをさせることができます。そこでテストを使用します-返された(解析された)日付がNAの場合は、何かを実行します。
日付の解析にtryCatch()
ブロックまたはtry()
を追加します。
1つの型のデータ構造(charのベクトル)から別の型に移行するとき、全体は少し奇妙ですが、list
型に保持しない限り、型を簡単に混在させることはできません。だから多分あなたはこれを再考する必要があります。
testFunction()
が簡単ではない、および/または変更できないと仮定すると、tryCatch()ブロックを使用して独自の関数でラップできます。例えば:
> FaultTolerantTestFunction <- function(date_in) {
+ tryCatch({ret <- testFunction(date_in);}, error = function(e) {ret <<- NA});
+ ret
+ }
> FaultTolerantTestFunction('bozo')
[1] NA
> FaultTolerantTestFunction('2010-03-21')
[1] "2010-03-21"