То, что я пытаюсь достичьR - tryCatch предупреждение записываются данные
Я пытаюсь написать свою собственную функцию «вменить» в R с заявлением tryCatch, который: 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...)
)
проблема
Чтобы проверить, если моя проверка работала я снабжал функцию с именем VEC тор НАН Украины, таким образом:
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 ведут себя таким образом?
- Является ли моя стратегия проверки и обработки ошибок оптимальной (очевидно, без ошибок)?
Большое спасибо за ваше время.
Rob
Спасибо за Ваш ответ и информацию о печати. Я этого не осознавал. Что мне нужно, это две разные вещи: 1. Если 'stopifnot' выходит из строя, функция останавливается с сообщением об ошибке. 2. Если функция запускается, но оставляет некоторые значения не вмененными, возникает предупреждение. Т.е. я не хочу, чтобы функция продолжалась, если 'stopifnots' терпит неудачу. –
Хорошо! Помогает ли ответ? Если нет: какие две разные вещи? –
К сожалению, я продолжаю нажимать клавишу ввода, прежде чем заканчивать комментарий. –