John  John - 1 month ago 9
R Question

How to tell lapply to ignore an error and process the next thing in the list?

I have an example function below that reads in a date as a string and returns it as a date object. If it reads a string that it cannot convert to a date, it 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


Now, I want to use lapply and apply this function over a list of dates:

dates1 = c("2010-04-06", "2010-04-07", "2010-04-08")
lapply(dates1, testFunction) # this works fine


But if I want to apply the function over a list when one string in the middle of two good dates returns an error, what is the best way to deal with this?

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


I presume that I want a try catch in there, but is there a way to catch the error for the "foo" string whilst asking lapply to continue and read the third date?

Answer

Use a tryCatch expression around the function that can throw the error message:

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

The nice thing about the tryCatch function is that you can decide what to do in the case of an error (in this case, return NULL).

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

[[2]]
NULL

[[3]]
[1] "2010-04-08"
Comments