我正在研究一个R包,其中相同的输入检查功能由导出到用户的多个“实际”功能调用。如果我使用一个简单的stop()
调用,则错误消息将表明输入检查功能中发生了错误,这不是那么有用...
我想我可以通过将对输入检查函数的调用包装在tryCatch()
内,然后处理外部函数中的错误来解决此问题。这主要满足了我的要求,但是并没有给出我想要的输出。我最接近的是:
f <- function(i) {
tryCatch({
check_input(i)
}, error = function(e) stop("in f: ", e$message, call. = FALSE)
)
}
check_input <- function(i) {
if(i < 0)
stop("i is negative, value given was ", i)
}
f(-1)
# Error: in f: i is negative, value given was -1
理想情况下,我希望错误消息是
Error in f: i is negative, value given was -1
,如果在stop
而不是f()
中调用check_input()
,情况就是这样。
答案 0 :(得分:2)
这是从调用堆栈中获取函数名称并将其粘贴到错误消息中的方法
f <- function(i) {
check_input(i)
}
g <- function(i) {
check_input(i)
}
check_input <- function(i, from=deparse(sys.calls()[[sys.nframe()-1]][[1]])) {
getmsg <- function(m) ifelse(!is.null(from), paste0("in ", from, ": ", m), m)
if(i < 0)
stop(getmsg(paste0("i is negative, value given was ", i)), call. = FALSE)
}
f(-1)
# Error: in f: i is negative, value given was -1
g(-1)
# Error: in g: i is negative, value given was -1
您还可以调用check_input(i, from="otherfunction")
来显示所需的任何函数名称,或调用check_input(i, from=NULL)
来隐藏函数名称。