【问题标题】:tryCatch in R ProgrammingR 编程中的 tryCatch
【发布时间】:2021-03-03 13:00:50
【问题描述】:

在 R 中,我想创建一个在遇到任何错误时返回 Flag=0 的函数:

Error<-function(x){
       tryCatch(x,
       error=function(e{
       Flag=0
         }
      )
}

当我输入时:错误(5+b)。它不反映 Flag=0。

【问题讨论】:

  • 什么意思,"return Flag=0" ...你的意思是返回一个命名的向量或列表,如list(Flag=0),还是你试图将值0 分配给调用环境中名为Flag 的对象?或者你只是想让它返回0
  • 赋值0
  • 好吧,你需要打破范围并违背函数式编程来做到这一点。虽然我认为将新变量分配到调用(或全局)环境中是不好的做法,但您可以使用 assign 来做到这一点。使用 &lt;&lt;- (如答案)有些工作,但不允许您控制变量放置在哪个环境中。例如,如果 this 是从另一个函数调用的,那么 (1) 如果该函数在其环境中有一个 Flag 对象,则该对象被分配 0,否则 (2) Flag 在全球环境。

标签: r error-handling try-catch try-catch-finally


【解决方案1】:
Flag <- 1

tryCatch(
  5+b,
  error=function(e) { Flag <<- 0}
)

Flag
[1] 0

在您的代码中,Flag 的范围是错误处理程序的本地范围。使用&lt;&lt;- 在全局环境中进行赋值。

【讨论】:

  • 相反,如果我在函数外部使用 tryCatch(x,..),我将几个表达式定义为:y
  • @r2evan 上面的 cmets 值得注意。我接受我的回答是一种简单的方法,不能满足所有情况。
【解决方案2】:

如果发生错误,您可以在此处返回一个字符串 ('error'),并检查它的值是否返回 1/0。

Error<-function(x){
  y <- tryCatch(x,error=function(e) return('error'))
  as.integer(y != 'error')
}

Error(sqrt('a'))
#[1] 0
Error(sqrt(64))
#[1] 1

【讨论】:

  • 我不想让 tryCatch 评估并返回输出,我有一个抛出错误的函数。如果有错误,我只希望它分配值 0,如果没有错误,则分配值 1。你能帮忙吗?
猜你喜欢
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
相关资源
最近更新 更多