【发布时间】:2014-12-19 20:42:50
【问题描述】:
我正在努力实现的目标
我正在尝试使用 tryCatch 语句在 R 中编写我自己的“估算”函数: 1. 输出包含函数名称的警告/错误消息,以便我可以更轻松地调试。 2. 如果函数运行正常但未估算所有缺失值,则发出警告。
ImputeVariables <- function(impute.var, impute.values,
filter.var){
# function to impute values.
# impute.var = variables with NAs
# impute.values = the missing value(s) to replace NAs, value labesl are levels
# filter.var = the variables to filter on.
# filter.levels = the categories of filter.var
tryCatch({
filter.levels <- names(impute.values)
# Validation
stopifnot(class(impute.var) == class(impute.values),
length(impute.values) > 0,
sum(is.na(impute.values)) == 0)
# Impute values
for(level in filter.levels){
impute.var[which(filter.var == level & is.na(impute.var))] <-
impute.values[level]
}
# Check if all NAs removed. Throw warning if not.
if(sum(is.na(impute.var)) > 0){
warning("Not all NAs removed")
}
# Return values
return(impute.var)
},
error = function(err) print(paste0("ImputeValues: ",err)),
warning = function(war) print(paste0("ImputeValues: ",war))
)
}
impute.var 和 filter.var 是取自 data.frame 的向量(它们是年龄和头衔的向量(例如“先生”、“夫人”)
impute.values 是与 impute.var 相同类型的向量,但其标签取自 filter.var(即格式为 c('Mr' = 30, 'Mrs' = 25...))
问题
为了检查我的验证是否有效,我为函数提供了一个命名的 NA 向量,因此:
ages <- c(34, 22, NA, 17, 38, NA)
titles <- c("Mr", "Mr", "Mr", "Mrs", "Mrs", "Mrs")
ages.values <- c("Mr" = NA, "Mrs" = NA)
ages.new <- ImputeVariables(ages, ages.values, titles)
print(ages.new)
但它会输出以下内容:
"ImputeValues: Error: class(impute.var) == class(impute.values) is not TRUE\n"
"ImputeValues: Error: class(impute.var) == class(impute.values) is not TRUE\n"
这两行是由于打印ages.new向量的函数和下面的打印语句打印ages.new(为什么?)
如果我注释掉验证(stopifnot 函数),那么我会得到:
"ImputeValues: simpleWarning in doTryCatch(return(expr), name, parentenv, handler): Not all NAs removed\n"
我在问什么
- 为什么 tryCatch 块会这样?
- 我的验证和错误处理策略是否最佳(显然没有错误)?
非常感谢您的宝贵时间。
罗伯
【问题讨论】:
标签: r error-handling