我在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"
发生以下情况:
在抛出警告后(即print("line after warning was thrown")
),它不会运行该行。由于我的options('warn')
设置为0
(默认),因此我希望函数f1
在tryCatch捕获警告之前运行到最后。在它抛出的那一刻它似乎正在捕捉警告。因此,在发出警告后,执行不会进入行。
此外,变量f1
中a
调用的返回值是警告块中的最后一条消息。它应该不是f1
我觉得这两种行为很奇怪。 我对tryCatch行为的理解是否有缺陷,或者我做错了什么?
Backstory:在我遇到这种行为的实际代码中,f1
碰巧是一个很大的功能,需要花费大量的时间才能运行。
我们注意到,捕获f1('a')
返回值的变量将包含一个文本字符串而不是数据帧。