delay a function if it throws an error: try_catch and if else
delay a function if it throws an error: try_catch and if else
我试着写一个 function
如果它抛出错误,它将以一定的延迟重复(在我的例子中只有一次,更好的是两次不同的时间延迟)。如果该功能在尝试 2 次后仍不起作用,则它应该 return NA
。
read.csv
只是举例说明,在我的真实数据中是一个抓取功能。
这个 post 有点帮助 using tryCatch with Sys.sleep upon encountering an error 。但是,我并没有搞清楚如何实现多次尝试。
我的做法:
muhur <- function(x){if (is.na(try_catch({read.csv(x)},
.w=function(w){message("error1")},
.e=function(e){return(NA_character_)})))
{message("warning, delay 10 s")
Sys.sleep(10)
try_catch({read.csv(x)},
.w=function(w){message("error2")},
.e=function(e){return(NA_character_)})}
else {try_catch({read.csv(x)},
.w=function(w)message("error3"),
.e=function(e)return(NA_character_))}
}
我的问题:
我的方法相当费力,并且不会抛出第一条错误消息。而且,我不知道如何进行第二次尝试。
test<- data.frame(a=c("test1","test"))
test%>% group_by(a) %>% mutate(b=muhur(a))
warning, delay 10 s
warning, delay 10 s
# A tibble: 2 x 2
# Groups: a [2]
a b
<fct> <chr>
1 test1 <NA>
2 test <NA>
我的问题:
有没有更好的(更省事、更清晰)的方法来解决我的问题?
根据 Roland 的建议,这里有一个解决方案:
muhur <- function(x, tries = 2){
if (tries <= 0)
stop("Too many tries")
result <- try(read.csv(x))
if (inherits(result, "try-error")) {
cat("Failed, trying again in 10 seconds...\n")
Sys.sleep(10)
muhur(x, tries = tries - 1)
} else
result
}
我无法使用 withRestarts
解决方案;我发现它的文档和博客文章都非常不透明。
我试着写一个 function
如果它抛出错误,它将以一定的延迟重复(在我的例子中只有一次,更好的是两次不同的时间延迟)。如果该功能在尝试 2 次后仍不起作用,则它应该 return NA
。
read.csv
只是举例说明,在我的真实数据中是一个抓取功能。
这个 post 有点帮助 using tryCatch with Sys.sleep upon encountering an error 。但是,我并没有搞清楚如何实现多次尝试。
我的做法:
muhur <- function(x){if (is.na(try_catch({read.csv(x)},
.w=function(w){message("error1")},
.e=function(e){return(NA_character_)})))
{message("warning, delay 10 s")
Sys.sleep(10)
try_catch({read.csv(x)},
.w=function(w){message("error2")},
.e=function(e){return(NA_character_)})}
else {try_catch({read.csv(x)},
.w=function(w)message("error3"),
.e=function(e)return(NA_character_))}
}
我的问题:
我的方法相当费力,并且不会抛出第一条错误消息。而且,我不知道如何进行第二次尝试。
test<- data.frame(a=c("test1","test"))
test%>% group_by(a) %>% mutate(b=muhur(a))
warning, delay 10 s
warning, delay 10 s
# A tibble: 2 x 2
# Groups: a [2]
a b
<fct> <chr>
1 test1 <NA>
2 test <NA>
我的问题:
有没有更好的(更省事、更清晰)的方法来解决我的问题?
根据 Roland 的建议,这里有一个解决方案:
muhur <- function(x, tries = 2){
if (tries <= 0)
stop("Too many tries")
result <- try(read.csv(x))
if (inherits(result, "try-error")) {
cat("Failed, trying again in 10 seconds...\n")
Sys.sleep(10)
muhur(x, tries = tries - 1)
} else
result
}
我无法使用 withRestarts
解决方案;我发现它的文档和博客文章都非常不透明。