捕获无法出现的错误

时间:2015-10-28 18:15:54

标签: r

我想从D%4捕获错误并继续前进。错误是:

Error: unexpected input in "D%4"

通常,如果正在调用函数,则以下工作:

capture_warn_error <- function(x){
    tryCatch({
        x
    }, warning = function(w) {
        w
    }, error = function(e) {
        e
    })
}

capture_warn_error(D%4) 

但是没有恢复是可能的,因为`D%4立即关闭所有东西:

## > capture_warn_error(D%4)
## Error: unexpected input in "capture_warn_error(D%4)"

无论如何要抓住这样一个顽固的野兽并继续前进?我知道D%4不是一个对象,但这适用于其他非对象:

capture_warn_error(means)
## <simpleError in doTryCatch(return(expr), name, parentenv, handler): object 'means' not found>

很高兴:

  1. 了解D%4means
  2. 无法恢复的原因
  3. 找到一种方法来恢复静止并捕获D%4的错误

3 个答案:

答案 0 :(得分:4)

正如其他人所说,这是因为在控制台输入的文本被传递给解析器。 D%4未通过有效R表达式的严格测试,因为单个%在R名称内无效(尽管它会创建一个令牌,如果有一个令牌将被解释为用户定义的函数关闭%)和%也不是函数名称(尽管%%是)。在处理函数的参数时会发生错误,因此它永远不会到达内部tryCatch - 调用。我最初没有想到你想要将这个输入解析为R代码,所以认为简单地将readline包装为要输入的单个参数可能满足:

mfun <- function( x=readline(">>+ ") ){ print(x) }
mfun()
#-----screen will display--------
>>+ D%4
[1] "D%4"

如果我对你的意图错了,就像重新阅读问题时那样,那么这会将你的输入机制构建到你的capture_error函数中。这会将这些字符作为未解析的文本,然后在tryCatch附件中进行解析:

> capture_warn_error <- function(x=readline(">>+ ")){
+     tryCatch({ eval(parse(text=x))
+         
+     }, warning = function(w) {
+         w
+     }, error = function(e) {
+         e
+     })
+ }
> capture_warn_error(D%4)
Error: unexpected input in "capture_warn_error(D%4)"
> capture_warn_error()
>>+ D%4
<simpleError in parse(text = x): <text>:1:2: unexpected input
1: D%4
     ^>
> err <- capture_warn_error()
>>+ D%4
> err
<simpleError in parse(text = x): <text>:1:2: unexpected input
1: D%4
     ^>

> err <- capture_warn_error()
>>+ D %% 4
> err
<simpleError in D%%4: non-numeric argument to binary operator>
> err <- capture_warn_error()
>>+ 4 %smthg% 2
> err
<simpleError in eval(expr, envir, enclos): could not find function "%smthg%">

如上所示,它确实要求您不在参数列表中向函数调用提供任何输入,而是使用空参数列表进行捕获调用。

答案 1 :(得分:3)

您可以设置一个捕获输入并解析它的函数,将其包装在capture_warn_error函数中。

getfunction <- function(){
  x<-readline()
  if(x == "exitnow"){return("bye!")}
  print(capture_warn_error(eval(parse(text = x))))
  getfunction()
}

他们现在正在非控制台提示下输入,但它会运行正常 - 分配将需要工作。

1+1
[1] 2
d%e
<simpleError in parse(text = x): <text>:1:2: unexpected input
1: d%e
     ^>
exitnow
[1] "bye!"

答案 2 :(得分:0)

我认为这适用于捕获错误,尽管它有点复杂。

a <- try(eval(parse(text="D%4")))