我有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表达式?
答案 0 :(得分:1)
1)我们可以把它变成一个函数,如果它找到一个就会返回x
,否则就会停止。我们还使用for
代替while
和if
代替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