我想从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>
很高兴:
D%4
与means
D%4
的错误答案 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")))