如何在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
循环(函数),以便:
- 当url错误时,输出将是:“url错误,无法获取”。
- 当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
参数error
和warning
)。 这些可以是已经存在的函数,但是你也可以在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数情况下会出现错误。
-
设置tryCatch作为函数的一部分。 例如:
irr2 <- function (x) { out <- tryCatch(irr(x), error = function(e) NULL) return(out) }
-
对于错误(或警告)的工作,你实际上需要创build一个函数。 我原本是为错误部分只写了
error = return(NULL)
和所有的价值回来了空。 -
记得创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=
部分。