gpt4 book ai didi

r - 来自assert_that() 的警告而不是错误?

转载 作者:行者123 更新时间:2023-12-03 03:47:23 25 4
gpt4 key购买 nike

我正在使用 R 的assertthat 包,并且希望(暂时)在断言失败时输出警告而不是错误。使用assertthat 包最简单的方法是什么?

我意识到想要警告而不是错误有点违背了断言的用途。从长远来看,我们确实希望在断言失败时输出错误。从短期来看,我们仍然希望代码即使在输入错误的情况下也能运行,因为输入错误的输出目前仍然“足够好”。

一个简单的例子:假设我有一个函数,将 x 作为输入并输出 x+5。如果 x!=3 我想输出警告。由于我们最终将使用assert_that,因此如果我们可以使用assertthat 包来发出警告,那就太好了。

从长远来看,我们将使用这个:

> x <- 3
> fn <- function(x) {assert_that(x==3); return(x+5)}
> fn(3)
[1] 8
> fn(4)
Error: x not equal to 3

从短期来看,这是我迄今为止最好的:

> fn <- function(x) {if(!see_if(x==3)) warning(validate_that(x==3)); return(x+5)}
> fn(3)
[1] 8
> fn(4)
[1] 9
Warning message:
In fn(4) : x not equal to 3

如果可能的话,我正在寻找更简洁的解决方案(最好的情况是将“output_warning”参数传递给assert_that,但我认为这种情况不存在)。

最佳答案

我创建了一个用户定义的函数,它接受与您要运行 validate_that() (最终为 assert_that())的表达式相对应的字符串。如果断言失败,该函数会打印一条警告,否则保持静默。使用方法见下文。如果需要,您可以轻松扩展此自定义函数以接受多个表达式。请注意,我还使用 sys.calls() 来获取调用此辅助函数的函数的名称。这是一条重要的信息,因此您可以将警告与实际生成警告的代码关联起来。

assert_that_soft <- function(exp) {
if (!exp) {
print (paste("Error in function:",
parse(sys.calls()[[sys.nframe()-1]])) ) # name of caller
}
}

用法:

> fn <- function(x) { assert_that_soft(x==3); return(x+5) }
> fn(3)
[1] 8
> fn(8)
[1] "Error in function: fn(8)"
[1] 13

关于r - 来自assert_that() 的警告而不是错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31151101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com