【问题标题】:Equivalent of "throw" in R相当于 R 中的“投掷”
【发布时间】:2010-12-09 03:37:51
【问题描述】:

如何在 R 中“抛出”错误?我有一个函数,它接受一个数据框和一些列名并用它们做一些事情。如果这些列不存在,我希望该函数停止并根据它停止所有函数。

我查看了 recoverbrowsetraceback,但是,它们似乎很接近,但不是我想要的。

【问题讨论】:

  • 对,recover、browser、traceback是用来调试的,而try/catch系统是用来处理生产代码中的错误的。
  • 我喜欢提问者在一个问题中多次使用他们要查找的函数的名称;)
  • 我认为这个问题的支持率高于最佳答案是有原因的。尽管this other question 在技术上是题外话,但它是对 Stack Overflow 著名的不熟悉主题的那种非常紧凑的总结。

标签: r error-handling


【解决方案1】:

help(tryCatch):

条件由 'signalCondition'。此外,
'stop' 和 'warning' 函数有 已修改为也接受
条件参数。

以及稍后在“另见”下:

'stop'和'warning'信号条件,而'try'本质上是一个 'tryCatch' 的简化版。

所以你可能想要stop

【讨论】:

  • 效果很好。 R 是如此的奇怪,这不是他们自己的过错——它的设计早在我们解决好的解释性语言设计之前就已经设计好了。
  • 根据作者的说法,它深受Scheme的影响,既古老又好。 R 是“lispy”,但具有时髦的数据结构。 R 中“有趣”的部分可能与许多约定与其他语言不同,特别是 C 语言家族,它在语法上也很接近。我猜是因为该语言是由一群需要一个好工具的统计学家进化而来的,而不是开发人员需要一个好的工具。只是“点”只是一个字符这一事实需要很长时间才能接受。
  • 这里的一些基本示例会很棒,不仅有引用。这里stackoverflow.com/a/23917007/54964
  • 我在搜索如何使用更合理的错误消息重新抛出 R 中的错​​误,但保持跟踪完整时遇到了这个问题(如,您在错误后执行 traceback() 以查看出了什么问题)。在tryCatcherror 参数中使用stop 会弄乱跟踪。但是,finally 参数将允许抛出额外的消息并保持跟踪有用。不完全是主题,但是,我觉得,重要到足以保证一些缺点和适度的威胁,将这条评论踢出窗外。 :-)
【解决方案2】:

简单示例:

f <- function(a, b){ 

    if (a == 0){ 
            stop("error message")
    }
 }

【讨论】:

【解决方案3】:

Dirk 提到的基本功能之外:

R.oo package 具有额外的异常处理功能,包括一个非常有用的 throw() 函数。您可以使用常用的 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!"

您可以在此处阅读更多信息:http://www1.maths.lth.se/help/R/R.oo/

【讨论】:

  • 呵呵。没有 OO,R 还不够时髦吗?很抱歉被翻转了,绝对感谢您提供有趣的答案,但我将使用上面的普通旧 stop()。
  • 现在还有更多的面向对象。 :)
  • @ws。 R 有什么好玩的? plot 绘制一个函数,try stop warn 一切都如你所愿,几乎我想做的一切都是单线。
  • 通常“单行文字的力量”不是衡量语言的好指标。对于我们许多人来说,可读、可理解的代码胜过更少的行。事实上,很多事情对我来说是难以理解的,因为我是一个初学者,我会尝试相应地调整期望值。但是其他语言使得从 0 到完成工作变得相当直观。 R 似乎也形成了一种聪明的、难以阅读的单行文字的文化。我会主张一种最大限度地使用类似英语的代码的文化,这种文化通常也可以是单行代码,比如 Ruby。
【解决方案4】:

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

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

df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))

这将引发以下错误:

Error: !is.null(df$c) is not TRUE

【讨论】:

  • 如果你想改变stopifnot产生的默认错误信息,你可以用tryCatch包装它:tryCatch(error = function(cnd) "your message here", stopifnot(your_condition)
【解决方案5】:

您可以检查该列是否存在并做任何您想做的事情。
假设一个名为 df1data.frame 并检查列 col1 是否存在:

if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")

if(! any(grepl('^col1$',colnames(df1)))) return(-1)

例如

【讨论】:

    猜你喜欢
    • 2013-12-10
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多