R 如何告诉lapply忽略一个错误并处理列表中的下一个内容?

R 如何告诉lapply忽略一个错误并处理列表中的下一个内容?,r,error-handling,try-catch,lapply,R,Error Handling,Try Catch,Lapply,下面有一个示例函数,它将日期作为字符串读入并作为日期对象返回。如果读取的字符串无法转换为日期,则返回错误 testFunction <- function (date_in) { return(as.Date(date_in)) } testFunction("2010-04-06") # this works fine testFunction("foo") # this returns an error 但是如果我想在两个好的日期中间的一个字符串返回一个错误时把

下面有一个示例函数,它将日期作为字符串读入并作为日期对象返回。如果读取的字符串无法转换为日期,则返回错误

testFunction <- function (date_in) {
    return(as.Date(date_in))
    }

testFunction("2010-04-06")  # this works fine
testFunction("foo")  # this returns an error

但是如果我想在两个好的日期中间的一个字符串返回一个错误时把函数应用到一个列表上,那么处理这个问题的最佳方法是什么?p>

dates2 = c("2010-04-06", "foo", "2010-04-08")
lapply(dates2, testFunction)

我假设我想要一个try-catch,但是有没有办法在请求lapply继续并读取第三个日期时捕获“foo”字符串的错误?

在可以抛出错误消息的函数周围使用
tryCatch
表达式:

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

人们可以尝试保持它的简单性,而不是使其复杂化:

  • 使用矢量化的日期解析
您可以简单地将
na.omit()
或其周围的任何内容包装起来。或者找到NAs的索引并相应地从初始向量中提取,或者使用NAs的补码来查找解析的日期,或者,或者,或者。都在这里了

  • 你可以让你的
    testFunction()
    做点什么。在那里使用测试——如果返回(解析)的日期为NA,则执行一些操作

  • 在日期解析中添加
    tryCatch()
    块或
    try()


当您从一种类型的数据结构(字符向量)转换到其他类型时,整个过程有点奇怪,但是您不能轻松地混合类型,除非您将它们保存在
列表中。因此,您可能需要重新考虑这一点。

假设
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"

>FaultTolerantTestFunction您还可以使用
purrr
helper函数
map
可能的
来完成此类任务。比如说

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

此处
可能会返回NA(或者,如果发生错误,您指定的任何值。

在一天结束时,我们都在做相同的事情——John不需要异常处理。如果不是日期,则返回NA。为什么要让事情变得更困难呢?是的,在这种情况下,这当然是正确的。尽管如果问题是广义的,那么使用
tryCatch
是正确的可能是继续处理
lappy
中的错误的最佳方法。我认为日期示例只是一个示例?感谢Dirk和Shane,实际上异常处理就是我所寻找的。日期只是一个更复杂函数的示例,但我能想到的最简单的事情是从列表返回错误另请参见
plyr
中的
failwith
函数,该函数自动执行此常见任务。另一种可能是在lappy中添加tryCatch,并让函数引发错误。与往常一样。
lappy(日期2,函数(x)tryCatch(testFunctionWihoutTryCatch(x),error=function(e)NULL))
。当然,在这种特殊情况下,德克的评论非常有意义。非常密切相关:
R> as.Date( c("2010-04-06", "foo", "2010-04-08") )
[1] "2010-04-06" NA           "2010-04-08"
> 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"
library(purrr)
map(dates2, possibly(testFunction, NA))