R:抛出警告时出现奇怪的tryCatch行为()

时间:2017-09-26 17:17:47

标签: r exception try-catch

我在R中使用tryCatch时遇到了一个问题。以下玩具功能应该有助于解释:

## Toy Function that throws a Stop error on being given 1 as input and halts execution
## Warning on being given 2 as input and returns 2
## for all other inputs just echoes it back.

f1=function(i){
          print("in f1")
          if(i==1){
            stop("Error: i=1 encountered")
            }else if (i==2){ 
            warning("Warning: i=2 encountered")
            print("line after warning was thrown")
            }else {
            print ("alls' ok")
            }
          print(paste0("Out of If condition: ",i))
          return(i)
        }


## function calls f1 to incite error or warning behavior.
        f2=function(i){
         print("in f2")
         tryCatch(
           {a=f1(i)},  ## {} or () are needed around the expression, else R throws an Error
                error=function(e){ 
                  stop(paste0("Error in f2  ",e));
                  print(e)
                  },
                warning=function(w){ 
                  print("back in f2 ");
                  #print(paste0("Warning = ",w))
                  }
              )
          print(paste0("contents of a= ",a))
        return(a)
         }

现在:该函数的行为符合输入的预期!= 2。 但是在给出2作为输入时,

        > f2(2)
        [1] "in f2"
        [1] "in f1"
        [1] "back in f2 "
        [1] "contents of a= f2 hello"
        [1] "f2 hello"

发生以下情况:

  1. 在抛出警告后(即print("line after warning was thrown")),它不会运行该行。由于我的options('warn')设置为0(默认),因此我希望函数f1在tryCatch捕获警告之前运行到最后。在它抛出的那一刻它似乎正在捕捉警告。因此,在发出警告后,执行不会进入行。

  2. 此外,变量f1a调用的返回值是警告块中的最后一条消息。它应该不是f1

  3. 的输出

    我觉得这两种行为很奇怪。 我对tryCatch行为的理解是否有缺陷,或者我做错了什么?

    Backstory:在我遇到这种行为的实际代码中,f1碰巧是一个很大的功能,需要花费大量的时间才能运行。 我们注意到,捕获f1('a')返回值的变量将包含一个文本字符串而不是数据帧。

0 个答案:

没有答案