R中的“ throw”的等效项


139

如何“抛出” R中的错误?我有一个函数,它接受一个数据框和一些列名,并对其进行填充。如果列不存在,我希望该函数停止并停止所有依赖于此的函数。

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


2
对,恢复,浏览器和回溯用于调试,而尝试/捕获系统用于处理生产代码中的错误。
哈兰

20
当提问者使用他们在一个问题中多次查找的函数的名称时,我喜欢它;)
hadley 2011年

我认为这个问题比最高答案有更多的理由。即使这个其他问题在技​​术上是不合时宜的,它也是Stack Overflow闻名的那种不熟悉主题的非常紧凑的摘要。
约西亚(Josiah Yoder)

Answers:


112

help(tryCatch)

条件用“ signalCondition”表示。此外,已对
stop”和“ warning”功能进行了修改,以也接受
条件参数。

然后在“另请参见”下:

stop”和“ warning”信号条件,“ try”本质上是“ ”的简化版本tryCatch

所以你可能想要stop


24
那很好。R很奇怪,没有他们自己的错-它的设计很早就已经消除了良好的解释语言设计。
forkandwait

5
根据作者的说法,它受Scheme的影响很大,Scheme既旧又好。R是“ lispy”,但具有时髦的数据结构。R中的“有趣”部分可能与许多约定与其他语言不同有关,特别是C语言族在语法上也很接近。我猜是因为这种语言是由一群需要一个好的工具的统计学家演变而来的,而不是由需要一个好的工具的开发人员演化而来的。“点”只是一个字符这一事实花了很长时间
才被接受。– KarlP

5
这里的一些基本示例将是很好的,不仅有引用。这里stackoverflow.com/a/23917007/54964
莱奥列奥波尔德·赫兹준 영


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!"

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


8
呵呵。没有OO,R还不够时髦吗?抱歉,请稍等,当然,感谢您提供有趣的答案,但我将使用上面的普通旧stop()。
forkandwait

1
现在有更多的面向对象。:)
Iterator

3
@ws。R的时髦之处是什么?plot绘制一个函数,try stop warn按照您的期望进行所有工作,而我想做的几乎所有事情都是单线的。
同构

4
对于一种语言,“单线力量”通常不是一个好的指标。对于我们许多人来说,易读易懂的代码胜过更少的行。确实,对于我来说,很多事情是我无法理解的,因为我是一个初学者,因此我尝试相应地调整期望值。但是其他语言使从0到完成工作变得相当直观。R似乎还发展了一种聪明,难以阅读的单线文化。我主张一种最大程度地类似于英语的代码的文化,这种文化通常也可以是单行代码,例如Ruby。
菲利普(Philip)

6

实际上,该功能stopifnot在代码中实现完整性检查非常方便。它接受多个逻辑表达式,如果其中任何一个表达式为false,则返回错误。

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

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

这将引发以下错误:

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

听起来像Python的assert(...)...
Josiah Yoder

1

您可以检查该列是否存在,然后执行所需的任何操作。
假设一个data.framenamed df1并检查列是否col1存在:

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

要么

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

例如

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.