103

检查某事是否为真的语句,如果不是,则打印给定的错误消息并退出

4

5 回答 5

131

stopifnot()

您可能还对用于单元测试的Runittestthat等软件包感兴趣。

于 2010-02-10T00:38:19.610 回答
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”替换为未通过测试的值,那就太好了,但您会得到您所支付的。

如果您需要比这更高级的东西,请查看 Runit 并按照 Harlan 的建议进行测试。

于 2011-08-25T22:02:44.213 回答
6

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

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

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

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

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

于 2018-06-01T04:34:50.027 回答
2

testit 包

-packagetestit提供了assert-function 作为一个简单的解决方案(https://github.com/yihui/testit

例子:

assert('one equals one', 1==1)
assert('seq and : produce equal sequences', seq(1L, 10L) == 1L:10L)
assert('seq and : produce identical sequences', identical(seq(1L, 10L), 1L:10L))

# multiple tests
T=FALSE; F=TRUE
assert('T is bad for TRUE, and so is F for FALSE', T!=TRUE, F!=FALSE)

# a mixture of tests
assert("Let's pray all of them will pass", 1==1, 1!=2, letters[4]=='d', rev(rev(letters))==letters)

来源:https ://github.com/yihui/testit/blob/master/R/testit.R

于 2021-09-09T12:05:32.857 回答
0

您可以为此使用checkmate -package。从他们的一个例子:

require(checkmate)

fact <- function(n, method = "stirling") {
  assertCount(n)
  assertChoice(method, c("stirling", "factorial"))

  if (method == "factorial")
    factorial(n)
  else
    sqrt(2 * pi * n) * (n / exp(1))^n
}

fact(2, method = 'blub')
于 2022-02-01T15:50:42.203 回答