我尝试编写一个function
,如果它抛出错误,它将以一定的延迟重复(在我的示例中只有一次,最好以不同的时间延迟两次)。如果函数在2次尝试后仍无法正常工作,则应返回NA
。
read.csv
只是一个示例,在我的真实数据中,这是一个抓取功能。
这篇文章对您有帮助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>
我的问题:
有没有更好(更清晰,更清晰)的方法来解决我的问题?
答案 0 :(得分:1)
这是基于罗兰(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
解决方案来工作;我发现它的文档和有关它的博客文章都不透明。