Lapplyにエラーを無視し、リストの次のものを処理するように伝える方法は?
-
25-09-2019 - |
質問
以下に、日付を文字列として読み取り、日付オブジェクトとして返す機能があります。日付に変換できない文字列を読み取ると、エラーが返されます。
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)
私はそこに試してみたいと思いますが、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()
またはそれの周りの何でも。または、NASのインデックスを見つけて、初期ベクトルからそれに応じて抽出するか、NASの補数を使用して解析された日付を見つけます。すでにここにあります。
あなたはあなたを作ることができます
testFunction()
何かをしてください。そこでテストを使用します - 返された(解析)日付がnaの場合、何かをしてください。Aを追加します
tryCatch()
ブロックまたはatry()
あなたの日付の解析に。
1つのタイプのデータ構造(charsのベクトル)から他のものに移行するにつれて、全体のものは少し奇妙ですが、それらを保持しない限り簡単にタイプを混ぜることはできません 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"