R是否像python一样有一个assert语句?


Answers:


123

stopifnot()

您可能也有兴趣像包Runittestthat进行单元测试。


如果stopifnot()停止,是否有一种方法可以控制所报告的错误消息?
尼克

12
@尼克,不。使用stopifnot()的有效性测试,测试代码是做什么它应该做的事情,但if (blahdiblah) stop("error message")对于输入测试,测试输入到程序是有效的。在正常使用期间,只有后者会发生。
哈兰2010年

6
另请参见Hadley的新assertthat软件包,该软件包提供了比实际更好的答案stopifnotgithub.com/hadley/assertthat
Harlan

12

@缺口:

如果编写带有描述性名称的函数来测试将在程序中引发错误的条件,则可以控制错误消息。这是一个例子:

Less_Than_8 = function(x) return(x < 8)

for (i in 1:10)
{
  print(i)
  stopifnot(Less_Than_8(i))
}

这将打印数字1至8,然后显示一条消息,提示

Error: Less_Than_8(i) is not TRUE

如果将括号中的“ i”替换为未通过测试的值,那很不错,但是您得到的是所支付的费用。

如果您需要比这更高级的工具,请按照Harlan的建议研究Runit并进行测试。


您也可以将函数定义放入其中stopifnot()
naught101

2
naught101,在命名函数中进行测试的目的是要在错误消息中打印测试的名称
Matthew

4

这可以通过stop命令来实现。此命令将停止执行功能并显示错误消息。例如,我们可以测试变量something是否为FALSE

if(something == FALSE){
   stop("error message to print")   
}

同样,该warning命令将打印警告(但继续执行代码)。

if(something == FALSE){
   warning("error message to print")   
}

这些都是由base R提供的,不需要运行任何程序包,也不需要包含编写您自己的函数的程序包。我更喜欢这种方法来编写具有较少依赖关系的代码,并且这种语法在程序包开发中被广泛使用。但是,“ assertthat”程序包支持类似的功能,而该assert_that功能最近已作为Hadley的“ tidyverse”的一部分发布。

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.