如何在R中编写trycatch

我想写的trycatch代码来处理从网上下载错误。

 url <- c( "http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html", "http://en.wikipedia.org/wiki/Xz") y <- mapply(readLines, con=url) 

这两个语句运行成功。 下面我创build一个不存在的url:

 url <- c("xxxxx", "http://en.wikipedia.org/wiki/Xz") 

url[1]不存在。 如何写一个trycatch循环(函数),以便:

  1. 当url错误时,输出将是:“url错误,无法获取”。
  2. 当url错误时,代码不会停止,而是继续下载,直到url列表的末尾?

那么:欢迎来到R世界;-)

干得好

设置代码

 urls <- c( "http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html", "http://en.wikipedia.org/wiki/Xz", "xxxxx" ) readUrl <- function(url) { out <- tryCatch( { # Just to highlight: if you want to use more than one # R expression in the "try" part then you'll have to # use curly brackets. # 'tryCatch()' will return the last evaluated expression # in case the "try" part was completed successfully message("This is the 'try' part") readLines(con=url, warn=FALSE) # The return value of `readLines()` is the actual value # that will be returned in case there is no condition # (eg warning or error). # You don't need to state the return value via `return()` as code # in the "try" part is not wrapped insided a function (unlike that # for the condition handlers for warnings and error below) }, error=function(cond) { message(paste("URL does not seem to exist:", url)) message("Here's the original error message:") message(cond) # Choose a return value in case of error return(NA) }, warning=function(cond) { message(paste("URL caused a warning:", url)) message("Here's the original warning message:") message(cond) # Choose a return value in case of warning return(NULL) }, finally={ # NOTE: # Here goes everything that should be executed at the end, # regardless of success or error. # If you want more than one expression to be executed, then you # need to wrap them in curly brackets ({...}); otherwise you could # just have written 'finally=<expression>' message(paste("Processed URL:", url)) message("Some other message at the end") } ) return(out) } 

应用代码

 > y <- lapply(urls, readUrl) Processed URL: http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html Some other message at the end Processed URL: http://en.wikipedia.org/wiki/Xz Some other message at the end URL does not seem to exist: xxxxx Here's the original error message: cannot open the connection Processed URL: xxxxx Some other message at the end Warning message: In file(con, "r") : cannot open file 'xxxxx': No such file or directory 

调查输出

 > head(y[[1]]) [1] "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">" [2] "<html><head><title>R: Functions to Manipulate Connections</title>" [3] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">" [4] "<link rel=\"stylesheet\" type=\"text/css\" href=\"R.css\">" [5] "</head><body>" [6] "" > length(y) [1] 3 > y[[3]] [1] NA 

补充说明

试着抓

tryCatch返回与执行expr相关的值,除非出现错误或警告。 在这种情况下,可以通过提供相应的处理函数来指定特定的返回值(请参见上面的返回值( return(NA) )(请参阅?tryCatch参数errorwarning )。 这些可以是已经存在的函数,但是你也可以在tryCatch()定义它们(就像我上面所做的那样)。

select处理函数的特定返回值的含义

正如我们已经指定NA在错误的情况下应该被返回, y的第三个元素是NA 。 如果我们select了NULL作为返回值,那么y的长度就是2而不是3因为lapply()将简单地“忽略”返回值为NULL 。 还要注意的是,如果你没有通过return()指定一个显式的返回值,处理函数将返回NULL (即在出现错误或警告的情况下)。

“不需要”的警告信息

由于warn=FALSE似乎没有任何效果,因此另一种抑制警告(在这种情况下并不真正感兴趣)的方法是使用

 suppressWarnings(readLines(con=url)) 

代替

 readLines(con=url, warn=FALSE) 

多个expression式

注意你也可以在“实际expression式部分”( tryCatch()参数expr tryCatch()放置多个expression式,如果你把它们放在大括号中(就像我在finally部分中说明的那样)。

R使用函数来实现try-catch块:

语法有点像这样:

 result = tryCatch({ expr }, warning = function(warning_condition) { warning-handler-code }, error = function(error_condition) { error-handler-code }, finally={ cleanup-code }) 

在tryCatch()中有两个可以处理的“条件”:“警告”和“错误”。 编写每个代码块时要了解的重要一点是执行状态和范围。 @资源

因为我刚刚失去了两天的生命,试图解决trycatch的irrfunction,所以我想我应该分享我的智慧(和缺less的东西)。 FYI – irr是FinCal的一个实际function,在这种情况下,在大数据集上的less数情况下会出现错误。

  1. 设置tryCatch作为函数的一部分。 例如:

     irr2 <- function (x) { out <- tryCatch(irr(x), error = function(e) NULL) return(out) } 
  2. 对于错误(或警告)的工作,你实际上需要创build一个函数。 我原本是为错误部分只写了error = return(NULL)和所有的价值回来了空。

  3. 记得创build一个子输出(像我的“出”)和return(out)

其他答案对我来说太复杂了,所以这里有一个直截了当的例子

 # do something, or tell me why it failed my_function <- function(baz){ tryCatch( ## This is what I want to do: something(mydata, baz) , ## But if an error occurs, do the following: error=function(error_message) { message("Yet another error message.") message("Here is the actual R error message:") message(error_message) return(NA) } ) } 

如果您还想捕获“警告”,只需添加warning=类似于error=部分。