web-dev-qa-db-ja.com

エラーを無視してリスト内の次のものを処理するようにlapplyに指示するにはどうすればよいですか?

以下に、日付を文字列として読み込み、日付オブジェクトとして返す関数の例を示します。日付に変換できない文字列を読み取ると、エラーが返されます。

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」文字列のエラーをキャッチする方法はありますか?

35
John

エラーメッセージをスローする可能性のある関数の前後に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"
60
Shane

複雑にするのではなく、単純に保つことを試みることができます。

  • ベクトル化された日付解析を使用する
_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型に保持しない限り、型を簡単に混在させることはできません。だから多分あなたはこれを再考する必要があります。

7

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"
0
mjv