多次尝试表达式,直到在R中成功
我有一个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
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