如何告诉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
但是,如果我想在两个良好日期中间的一个字符串返回错误时将功能应用于列表,那么处理此功能的最佳方法是什么?
dates2 = c("2010-04-06", "foo", "2010-04-08")
lapply(dates2, testFunction)
我假设我想尝试一下那里,但是有没有办法在要求Lapply继续阅读第三个日期的同时捕获“ 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,请做某事。添加一个
tryCatch()
块或atry()
到您的日期解析。
当您从单年数据结构(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"
不隶属于 StackOverflow