Насколько я понимаю, warning()
является альтернативой message()
, не обязательно stop()
, что вызывает ошибку. В предупреждении пользователь информируется о том, что что-то не так, как ожидалось, но пользователь сам решает, является ли проблема серьезной и хочет ли он переписать свой код.
Основное различие между message()
и warning()
состоит в том, что предупреждающее сообщение будет начинаться с Warning message:
, а R
отслеживает, появляется ли последнее. Вы можете сами выбрать, хотите ли вы, чтобы ваш код полностью останавливался при любом предупреждении, установив
options(warn = 2)
Одно из применений, о котором я могу подумать, - это предупредить пользователя о том, что функция, которую он / она использует, скоро устареет. Многие пользователи все равно выберут запуск кода и исправят его позже, когда у них будет время. Но они точно знают, что в будущем есть проблема.
Еще один вариант использования - информирование пользователя о проблеме, которая была устранена изнутри. В этом случае пользователь должен знать, что функция сделала больше, чем просил пользователь, в случае, если это не то, что они пытались сделать. Пример из dplyr
будет таким:
> a <- data.frame(x = c("p", "q", NA), y = c(1, 2, 3), stringsAsFactors = TRUE)
> b <- data.frame(x = c("p", "q", "r"), z = c(4, 5, 6), stringsAsFactors = TRUE)
> res <- inner_join(a, b, "x")
Warning message:
Column `x` joining factors with different levels, coercing to character vector
Это может означать, что существует серьезная проблема или абсолютно ничего, в зависимости от вашего варианта использования.
Вы можете выбрать остановку функции, если вы предпочитаете, чтобы пользователи получали ее самостоятельно. И на самом деле некоторые люди защищают этот принцип . Я обычно стараюсь сделать свои пакеты максимально удобными, чтобы людям не приходилось бороться с ошибкой, которую они не понимают. В то же время я хочу сообщить им, что они могли совершить распространенную ошибку и могли бы исправить ее, если это было не то, что они собирались сделать.