我想从 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
不可恢复 vs means
D%4
的错误 最佳答案
正如其他人所说,这是因为在控制台输入的文本会传递给解析器。 D%4
未能通过有效 R 表达式的严格测试,因为单个 %
在 R 名称中无效(尽管它会创建一个 token ,如果存在结束 %
和 %
,该 token 将被解释为用户定义的函数)也不是函数名(尽管 %%
是)。错误发生在处理函数的参数时,因此它从未到达内部 tryCatch
-称呼。我最初不知道您想将此输入解析为 R 代码,因此认为只需包装 readline
因为要输入的单个参数可能满足:
mfun <- function( x=readline(">>+ ") ){ print(x) }
mfun()
#-----screen will display--------
>>+ D%4
[1] "D%4"
如果我对您的意图有误,因为它出现在重新阅读问题时,那么这会将输入机制构建到您的 capture_error 函数中。这会将这些字符作为未解析的文本引入,然后在
tryCatch
中执行解析评估 shell :> 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%">
如上所示,它确实要求您不要在参数列表中向函数调用提供任何输入,而是使用空参数列表进行捕获调用。
关于r - 捕获无法捕获的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33398614/