如果遇到任何错误,是否有一种优雅的方法来强制执行函数并返回与其正常输出类型一致的NA
?
例如,要在R中拥有lm
个批处理数据,并选择一个估算值,避免使用tryCatch
停止错误:
lmCoeff <- function(beta, ...) {
tryCatch(ifelse(is.numeric(a <- lm(...)$coefficient[beta]), a, as.numeric(NA)),
error = function(e) {
return(as.numeric(NA))
} )
}
# test with 3 cases
(good <- lmCoeff(beta="cyl", mpg ~ cyl, mtcars))
(bad <- lmCoeff(beta="bad", mpg ~ cyl, mtcars))
(ugly <- lmCoeff(beta="cyl", ugly))
# output should always be of the same type:
str(good)
str(bad)
str(ugly)
问题在于是否有一种更优雅,更不特殊的方式来做到这一点。
答案 0 :(得分:1)
如上所述,如果发现任何错误,tryCatch
可用于捕获所有错误并输出NA
数字类型。如果您知道哪些错误是预期的,那么您可以使用if
语句直接检查它们。
例如,我可以想到两个可能的错误:用户输入无效数据对象,或者公式无效。因此,整洁(以及更负责任的解决方案)将是:
lmCoeff <- function(beta, ...) {
if(<data does not exist>){
a <- NA
warning("data not found")
} else if (<formula invalid>){
a <- NA
warning("formula invalid")
} else {
lapply(..., function(x) print(str(x))))
a <- lm(...)$coefficient[beta]
}
as.numeric(a)
}
}
当然,在实践中,如果编写条件来检查数据不存在,或者公式无效,那么过于复杂,那么为了简单起见,您可以使用tryCatch
。