如果在 R 中失败,则移至下一个代码行
Move to the next code line if failed In R
我不知道如何在 Google 上搜索它。
我有一个彼此独立的行代码 - 假设一行由于某种原因失败然后脚本的其余部分不会继续。我该如何让它继续?
例如:
library(RODBC)
library(sqldf)
myconn<-odbcConnect("production")
#第 1 行:
sqlQuery(myConn,"exec sp_v_table_1")
#第 2 行:
sqlQuery(myConn,"exec sp_v_table_2")
也失败了,因为第 1 行失败了
另外,我怎么知道某个代码行 - 例如:
sqlQuery(myConn,"exec sp_v_table_3")
通过成功没有失败?
你可以使用 tryCatch 块,你有一个参考 here
这里有一个使用它处理请求的例子:
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
# (e.g. 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)
}
来源来自this Whosebug 回复,我显然推荐你看一下。
您需要一种捕获错误的方法。
为此目的,我很欣赏的一个工具是 purrr
包中的 safely()
。
您在现有函数调用周围包装一个函数,即使在发生错误时也能安全地 returns 输出。
来自文档(log() 示例):
safe_log <- safely(log)
safe_log(10)
#> $result
#> [1] 2.302585
#>
#> $error
#> NULL
#>
safe_log("a")
#> $result
#> NULL
#>
#> $error
#> <simpleError in .Primitive("log")(x, base): non-numeric argument to mathematical function>
#>
这是一个 returns 列表,包含一个结果和一个错误元素。
使用try
命令。
通常这会导致错误并阻止随后来自 运行ning:
的代码
x <- "a" + 1
y <- 1
y
但是,如果我们在try
中将赋值运算符后面的部分包裹起来,错误会打印出来,但后面写的代码仍然可以运行:
x <- try("a" + 1)
y <- 1
y
请注意 x
有 class "try-error"
class(x)
"try-error"
因此,在您的示例中,您可以执行以下操作以确保后面的行 运行 同时仍然能够拾取前面失败的行:
x <- try(sqlQuery(myConn,"exec sp_v_table_3"))
y <- 1
y
class(x)
对象y
仍然会被创建,x
的class会告诉你sqlQuery(myConn,"exec sp_v_table_3")
运行是否成功。
tryCatch
在某种意义上是 try
的更灵活的版本。 try
只会 return class "try-error"
如果发生错误并允许后面的代码行到 运行,但 tryCatch
将允许您指定如果发生错误,您希望发生什么。您还可以指定如果 warning
发生或者即使代码 运行 成功,您希望发生什么。
而 purrr::safely
是 tryCatch
的包装。出现错误时指定的操作是 return 一个包含两个元素的列表:备用输出(默认情况下 NULL
)和错误消息。
我不知道如何在 Google 上搜索它。 我有一个彼此独立的行代码 - 假设一行由于某种原因失败然后脚本的其余部分不会继续。我该如何让它继续?
例如:
library(RODBC)
library(sqldf)
myconn<-odbcConnect("production")
#第 1 行: sqlQuery(myConn,"exec sp_v_table_1")
#第 2 行: sqlQuery(myConn,"exec sp_v_table_2")
也失败了,因为第 1 行失败了
另外,我怎么知道某个代码行 - 例如:
sqlQuery(myConn,"exec sp_v_table_3")
通过成功没有失败?
你可以使用 tryCatch 块,你有一个参考 here
这里有一个使用它处理请求的例子:
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
# (e.g. 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)
}
来源来自this Whosebug 回复,我显然推荐你看一下。
您需要一种捕获错误的方法。
为此目的,我很欣赏的一个工具是 purrr
包中的 safely()
。
您在现有函数调用周围包装一个函数,即使在发生错误时也能安全地 returns 输出。
来自文档(log() 示例):
safe_log <- safely(log)
safe_log(10)
#> $result
#> [1] 2.302585
#>
#> $error
#> NULL
#>
safe_log("a")
#> $result
#> NULL
#>
#> $error
#> <simpleError in .Primitive("log")(x, base): non-numeric argument to mathematical function>
#>
这是一个 returns 列表,包含一个结果和一个错误元素。
使用try
命令。
通常这会导致错误并阻止随后来自 运行ning:
的代码x <- "a" + 1
y <- 1
y
但是,如果我们在try
中将赋值运算符后面的部分包裹起来,错误会打印出来,但后面写的代码仍然可以运行:
x <- try("a" + 1)
y <- 1
y
请注意 x
有 class "try-error"
class(x)
"try-error"
因此,在您的示例中,您可以执行以下操作以确保后面的行 运行 同时仍然能够拾取前面失败的行:
x <- try(sqlQuery(myConn,"exec sp_v_table_3"))
y <- 1
y
class(x)
对象y
仍然会被创建,x
的class会告诉你sqlQuery(myConn,"exec sp_v_table_3")
运行是否成功。
tryCatch
在某种意义上是 try
的更灵活的版本。 try
只会 return class "try-error"
如果发生错误并允许后面的代码行到 运行,但 tryCatch
将允许您指定如果发生错误,您希望发生什么。您还可以指定如果 warning
发生或者即使代码 运行 成功,您希望发生什么。
而 purrr::safely
是 tryCatch
的包装。出现错误时指定的操作是 return 一个包含两个元素的列表:备用输出(默认情况下 NULL
)和错误消息。