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

多次尝试表达式,直到在R中成功,r,error-handling,try-catch,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 &l

我有一个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
尝试1)我们可以将其转换为一个函数,如果它找到一个,则返回
x
,否则停止。此外,我们使用
代替
,而使用
代替
,同时使用
如果
代替
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()
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"))

有没有理由不设置一个不会导致错误的种子,或者更优雅地处理下游的错误?如果确实需要
if(){.}else{}
则不要使用
if(){.}else{}
因此,您正在绘制一个随机数,但希望随机数大于一个值,例如0.3。反对使用
rand的理由是这个例子的原则。我的长得多的代码依赖于一个包,该包基于它决定使用的随机种子,有时会失败,大部分时间都有效。这将是编程的,所以我不能简单地设置一个种子,我不会提前知道什么种子会工作,什么会失败。基本上,我只是在寻找一种不同的方法来多次尝试表达式,直到表达式的返回满足一个条件(不是NA,不是null,不是error,诸如此类)。这里有很多很棒的方法,我真的很喜欢。很遗憾,没有任何具有此功能的软件包。
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"))
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