Lapplyにエラーを無視し、リストの次のものを処理するように伝える方法は?

StackOverflow https://stackoverflow.com/questions/2589275

質問

以下に、日付を文字列として読み取り、日付オブジェクトとして返す機能があります。日付に変換できない文字列を読み取ると、エラーが返されます。

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() ブロックまたはa try() あなたの日付の解析に。

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"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top