提问人:Andrea 提问时间:11/16/2023 最后编辑:Konrad RudolphAndrea 更新时间:11/17/2023 访问量:61
返回所有错误
Returning all errors
问:
假设我有以下函数结构(我实际问题的简化版本):
simple_function <- function(x, y) {
if (!is.numeric(x) && is.numeric(y)) {
stop("x must be a number")
}
else if (!is.numeric(y)) {
stop("y must be a number")
}
else if (is.numeric(x) && is.numeric(y)) {
result <- sub_fun(x, y)
}
return(result)
}
sub_func <- function(x) {
if (x > 5) {
result <- x * y
}
else if (x < 5) {
result <- x + y
}
else if (x == 5) {
stop ("x cannot be equal to 5.")
}
return(result)
}
a = 5
b = 'b'
> simple_function(a, b) : y must be a number
有没有办法以这样一种方式运行函数,即我得到两个相关的停止错误,如果它没有在第一个停止时退出,y 必须是一个数字,这些错误就会运行?
答:
3赞
Limey
11/17/2023
#1
评论者已经解释了为什么你不能(轻松)在基础 R 中做你想做的事。
该软件包允许您执行类似于您想要的事情。下面是代码的变体,更正了几个拼写错误。checkmate
library(checkmate)
simple_function <- function(x, y) {
allErrors <- makeAssertCollection()
assertNumeric(x, len = 1, add = allErrors)
assertNumeric(y, len = 1, add = allErrors)
sub_func(x, y, allErrors)
}
sub_func <- function(x, y, collection) {
assertFALSE(x == 5, add = collection)
reportAssertions(collection)
ifelse(x > 5, x * y, x + y)
}
a = 5
b = 'b'
simple_function(a, b)
Error in simple_function(a, b) : 2 assertions failed:
* Variable 'y': Must be of type 'numeric', not 'character'.
* Variable 'x == 5': Must be FALSE.
但是,在更复杂的实际示例中,在检测到错误后允许代码继续可能会导致更复杂的代码。我不建议允许将一个函数的错误输入传递给其他函数。
评论
stop()