相当于R中的"throw"

for*_*ait 128 error-handling r

如何在R中"抛出"错误?我有一个函数,它采用数据框和一些列名称,并用它们做的事情.如果列不存在,我希望函数停止并根据它停止所有函数.

我已经看过recoverbrowsetraceback,但同时,他们似乎是接近,但不是我所期待的.

Dir*_*tel 100

help(tryCatch):

条件由' signalCondition'表示.此外,
' stop'和' warning'函数已被修改为也接受
条件参数.

后来在'See Also'下:

' stop'和' warning'信号条件,' try'基本上是' '的简化版本tryCatch.

所以你可能想要stop.

  • 这非常有效.R是如此奇怪,没有他们自己的错 - 它是在我们解决良好的解释性语言设计之前设计的. (24认同)
  • 这里的一些基本例子很棒,不仅有引用.这里http://stackoverflow.com/a/23917007/54964 (4认同)
  • 据作者说,它深受Scheme的影响,它既古老又好.R是'lispy'但具有时髦的数据结构.R中的"有趣"部分可能与许多约定与其他语言不同,特别是C语言家族,它在语法上也很接近.我猜是因为语言是由一群需要一个好工具的统计学家演变而来的,而不是开发人员需要一个好工具.事实上,'点'只是一个角色需要很长时间才能接受. (3认同)
  • 我在搜索如何使用更明智的错误消息重新抛出 R 中的错​​误时遇到了这个问题,但保持跟踪完整(例如,在错误后执行 `traceback()` 以查看出了什么问题)。在“tryCatch”的“error”参数中使用“stop”会扰乱跟踪。但是,“finally”参数将允许抛出附加消息并保持跟踪有用。不完全切中主题,但是,我觉得,重要到足以保证一些缺点和适度的威胁将这个评论踢出窗外。:-) (3认同)

Chr*_*nez 45

简单的例子:

f <- function(a, b){ 

    if (a == 0){ 
            stop("error message")
    }
 }
Run Code Online (Sandbox Code Playgroud)


Sha*_*ane 8

除了Dirk提到的基本功能:

R.oo包具有附加的异常处理的功能,包括掷()函数,它是非常有用的.您可以使用常用的try或trycatch函数捕获异常:

> try(throw("Division by zero.")); print("It's ok!");
Error: [2009-10-22 10:24:07] Exception: Division by zero.
[1] "It's ok!"
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多相关信息:http://www1.maths.lth.se/help/R/R.oo/

  • 呵呵.没有OO,R不够时髦吗?很抱歉要翻转,非常感谢有趣的回答,但我会选择上面的普通老站(). (8认同)
  • 通常,"单行的力量"不是语言的良好指标.对于我们许多人来说,可理解的代码胜过少行.事实上,对我来说很难理解,因为我是初学者,我试图相应地校准期望.但是其他语言使得从0到完成任务变得非常直观.R似乎也开发了一种聪明,难以阅读的单行文化.我会争论一种最像英语的代码文化,它通常也可以像Ruby那样是单行代码. (4认同)
  • @ws.R有什么好玩的?`plot`绘制一个函数,`try``st停止``警告`所有工作正如你所期望的那样,几乎我想做的一切都是单行. (3认同)
  • 现在还有更多的 OO。:) (2认同)

Chr*_*ris 6

实际上,该函数stopifnot在您的代码中实现健全性检查非常方便。它接受几个逻辑表达式,如果其中任何一个的计算结果为 false,则返回错误。

示例:要检查数据框 'df' 中是否存在列 'c':

df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))
Run Code Online (Sandbox Code Playgroud)

这将引发以下错误:

Error: !is.null(df$c) is not TRUE
Run Code Online (Sandbox Code Playgroud)