多次尝试表达式,直到它在R中成功

时间:2018-04-24 22:35:19

标签: r error-handling try-catch

我有R代码,有时返回NA,导致下游错误。但是,失败的唯一原因是随机数不好。使用不同的起点再次运行表达式,它会生成不是NA的结果。

我已经设置while循环以在放弃之前多次尝试表达式。这是一个例子:

attempts <- 0
x <- NA
while(is.na(x) & attempts < 100) {
     attempts <- attempts + 1
     rand <- runif(1)
     x <- ifelse(rand > 0.3, rand, NA)
}
if(attempts == 100) stop("My R code failed")
x

我不喜欢这是多么笨重。

是否有一个函数,包或方法可以帮助简化这个try-repeat-try-again表达式?

1 个答案:

答案 0 :(得分:1)

1)我们可以把它变成一个函数,如果它找到一个就会返回x,否则就会停止。我们还使用for代替whileif代替ifelse

retry <- function() {
  for(i in 1:100) {
    rand <- runif(1)
    x <- if (rand > 0.3) rand else NA
    if (!is.na(x)) return(x)
  }
  stop("x is NA")
}

retry()

2)或者如果您不想在函数中停止,则删除stop行,将其替换为返回x的行,然后使用它(尽管它确实涉及测试x两次NA:

x <- retry()
if (is.na(x)) stop("x is NA")

3)或其他选项是将错误值传递给函数。由于惰性求值,bad参数仅在其实际上是坏的时才进行评估:

retry2 <- function(bad) {
  for(i in 1:100) {
    rand <- runif(1)
    x <- if (rand > 0.3) rand else NA
    if (!is.na(x)) return(x)
  }
  bad
}

retry2(stop("x is NA"))

4)如果您不介意使用break对NA进行两次测试,即使没有功能,也可以正常工作:

for(i in 1:100) {
  rand <- runif(1)
  x <- if (rand > 0.3) rand else NA
  if (!is.na(x)) break
}
if (is.na(x)) stop("x is NA")
x