Search code examples
rerror-handlingtry-catchlapply

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?


Solution

  • 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"