如果观察到警告,则跳过for循环[R]中的迭代

如果观察到警告,则跳过for循环[R]中的迭代,r,for-loop,try-catch,R,For Loop,Try Catch,我有一个循环来计算一个值。有时,这种计算会触发一个警告。如何检查是否触发了警告,然后跳过该迭代?我用的是R 在评论的帮助下,我找到了tryCatch(),并能够修改我的for循环,如下所示: for (i in seq(1,100,1)){ x<-sample(1:length(df$values), 1) input<-copy_df[x:x+5,] val<-tryCatch(myfunc(input$colA), warning=function(

我有一个循环来计算一个值。有时,这种计算会触发一个警告。如何检查是否触发了警告,然后跳过该迭代?我用的是R

在评论的帮助下,我找到了tryCatch(),并能够修改我的for循环,如下所示:

for (i in seq(1,100,1)){
    x<-sample(1:length(df$values), 1)
    input<-copy_df[x:x+5,]
    val<-tryCatch(myfunc(input$colA), warning=function(w) w)
    if (is(val,warning){ 
        next
    }
    print(paste0(i))
}
用于(序列(1100,1)中的i){

这里有一个完整的示例,使用随机生成警告的测试函数

set.seed(101)
foo <- function() {
  x <- runif(1)
  if(x<.9) warning("low x")
  x
}
for(i in 1:20) {
  didwarn <- tryCatch({x <- foo(); FALSE}, warning = function(w) return(TRUE))
  if(didwarn) {
    next
  }
  print(paste("high x", x))
}
set.seed(101)

foo请参阅
?Control
帮助页面。for循环有一个
next
关键字可移动到下一次迭代。但一般来说,如果包含一个简单的示例输入和所需的输出,可用于测试和验证可能的解决方案,则更容易帮助您。另请参阅另一个副本,了解如何检查警告:it is diffi无法检测警告发生的位置,因为每次迭代循环时我都会传递一个随机观察结果。因此,很难调试和创建一个可复制的示例。我要求的功能与myfunc()无关,而是更多的句柄警告()。只需将
tryCatch
环绕可能产生警告的任何内容即可。
for(i in 1:20) {
  tryCatch({
      x <- foo(); 
      print(paste("high x", x))
    }, 
    warning = function(w) {
      # do nothing
    })
}