简体   繁体   中英

R Script - How to Continue Code Execution on Error

I have written an R script which includes a loop that retrieves external (web) data. The format of the data are most of the time the same, however sometimes the format changes in an unpredictable way and my loop is crashing (stops running).

Is there a way to continue code execution regardless the error? I am looking for something similar to "On error Resume Next" from VBA.

Thank you in advance.

Use try or tryCatch .

for(i in something)
{
  res <- try(expression_to_get_data)
  if(inherits(res, "try-error"))
  {
    #error handling code, maybe just skip this iteration using
    next
  }
  #rest of iteration for case of no error
}

The modern way to do this uses purrr::possibly .

First, write a function that gets your data, get_data() .

Then modify the function to return a default value in the case of an error.

get_data2 <- possibly(get_data, otherwise = NA)

Now call the modified function in the loop.

for(i in something) {
  res <- get_data2(i)
}

You can use try :

# a has not been defined
for(i in 1:3)
{
  if(i==2) try(print(a),silent=TRUE)
  else print(i)
}

How about these solutions on this related question :

Is there a way to `source()` and continue after an error?

Either parse(file = "script.R") followed by a loop'd try(eval()) on each expression in the result.

Or the evaluate package.

If all you need to do is a small piece of clean up, then on.exit() may be the simplest option. It will execute the expression "when the current function exits (either naturally or as the result of an error)" ( documentation here ).

For example, the following will delete my_large_dataframe regardless of whether output_to_save gets created.

on.exit(rm("my_large_dataframe"))

my_large_dataframe = function_that_does_not_error()
output_to_save = function_that_does_error(my_large_dataframe)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM