繁体   English   中英

R 是否有如 python 中的断言语句?

[英]Does R have an assert statement as in python?

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

stopifnot()

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

@缺口:

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

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建议的那些。

这可以通过stop命令实现。 此命令将暂停执行函数并打印错误消息。 例如,我们可以测试变量somethingFALSE

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

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

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

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

您可以为此使用checkmate<\/a> -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')

之前对这个问题的回答已经过时了,所以我想我会添加一个使用现代 package 的答案。 R 中的断言器 package 在此处进行了很好的描述并在此处进行了记录。 The assertr package makes uses of two primary functions to validate datasets: verify evaluates a boolean expression using the scope of a dataframe passed to it, and will throw, and log the error in the attributes of the dataset if the expression returns FALSE . 如果发现错误,您可以选择继续处理数据集并将错误视为警告,或者您可以指示 R 终止处理。 这对于验证 dataframe 结构和内容很有用。 例如,使用汽车数据集,您可能想要验证它是否包含 32 行数据。 可以这样做:

library(assertr)
cars %>% verify(nrow(.)==32, error_fun = error_append) %>% 
  attributes() %>% 
  pluck("assertr_errors")

assertr_errors属性将包含未通过验证检查的验证错误列表,因此上述将产生以下内容:

[[1]]
verification [nrow(.) == 32] failed! (1 failure)

    verb redux_fn     predicate column index value
1 verify       NA nrow(.) == 32     NA     1    NA

您还可以使用以下链接中记录的assert function 添加其他验证检查。 例如,继续上面的示例,我们可以验证在变速中没有观察值超过 23 的值:

#Function that returns false if rule fails
is_greater_than_23<-function(x){
  x <=23
}

cars %>% assert(is_greater_than_23, speed, error_fun = error_append) %>% 
  attributes() %>% 
  pluck("assertr_errors")

返回:

[[1]]
Column 'speed' violates assertion 'is_greater_than_23' 5 times
    verb redux_fn          predicate column index value
1 assert       NA is_greater_than_23  speed    46    24
2 assert       NA is_greater_than_23  speed    47    24
3 assert       NA is_greater_than_23  speed    48    24
4 assert       NA is_greater_than_23  speed    49    24
5 assert       NA is_greater_than_23  speed    50    25

需要注意的是,在上面的示例中,我将error_append分配给verifyassert function 调用的error_fun参数。 这允许 R 在检查失败时继续处理数据并将其检测到的错误记录到assertr_errors属性。 一旦您在此属性中收集了错误,您就可以再次执行以下链接中记录的各种检查和其他验证步骤。 如果您希望程序在遇到错误时停止处理,您只需将error_append更改为error_report ,它会“在“整洁”的 data.frame 中打印有关错误的所有可用信息(包括所用谓词名称等信息) ,违规值等...)并停止执行。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM