43

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

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)

そこにtry catchが必要だと思いますが、lapplyに続行して3番目の日付を読み取るように依頼しながら、「foo」文字列のエラーをキャッチする方法はありますか?

4

4 に答える 4

70

tryCatchエラー メッセージをスローする可能性のある関数を式で囲みます。

testFunction <- function (date_in) {
  return(tryCatch(as.Date(date_in), error=function(e) NULL))
}

この関数の良いところtryCatchは、エラーが発生した場合にどうするかを決定できることです (この場合は return NULL)。

> lapply(dates2, testFunction)
[[1]]
[1] "2010-04-06"

[[2]]
NULL

[[3]]
[1] "2010-04-08"
于 2010-04-07T01:01:01.800 に答える
8

複雑にするのではなく、シンプルに保つように努めることができます。

  • ベクトル化された日付の解析を使用する
R> as.Date( c("2010-04-06", "foo", "2010-04-08") )
[1] "2010-04-06" NA           "2010-04-08"

あなたは簡単にラップすることができますna.omit()。または、NA のインデックスを見つけて、それに応じて初期ベクトルから抽出するか、NA の補数を使用して、解析された日付、または、または、またはを見つけます。それはすべてすでにここにあります。

  • あなたtestFunction()は何かをすることができます。そこでテストを使用します。返された (解析された) 日付が NA の場合は、何かを行います。

  • 日付の解析にtryCatch()ブロックまたは aを追加します。try()

1 つの型のデータ構造 (文字のベクトル) から別のデータ構造に移行すると、全体が少し奇妙になりますが、型を 1 つの型に保持しない限り、list型を簡単に混在させることはできません。ですから、これを再考する必要があるかもしれません。

于 2010-04-07T01:01:13.283 に答える
4

purrrヘルパー関数mapおよびを使用して、この種のタスクを実行することもできますpossibly。例えば

library(purrr)
map(dates2, possibly(testFunction, NA))

ここでpossiblyは NA (またはエラーが発生した場合は指定した値) が返されます。

于 2020-07-31T01:18:25.177 に答える
0

が些細なことではない、および/またはそれを変更できないと仮定する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"
于 2010-04-07T01:03:17.183 に答える