Когда вы используете предупреждение (MSG)? - PullRequest
0 голосов
/ 16 апреля 2019

Я немного смущен тем, почему у R warning(msg). Кажется, что в действительности во время выполнения кода ничего не происходит, за исключением хранения некоторых сообщений в warnings(), на которые никто никогда не смотрит.

Может быть, я использую это неправильно. Может быть, я неправильно понимаю его цель. Ни один другой язык, который я использовал, не имеет исключения предупреждения, у большинства просто есть исключение (я думаю, что оно равно error(msg) в R). Является ли warning(msg) исключением, которое я просто игнорирую, тогда какой в ​​этом смысл?

Может быть, у кого-то есть хорошее объяснение того, когда вы ДОЛЖНЫ использовать warning(msg)? или для чего он был предназначен?

Ответы [ 2 ]

3 голосов
/ 16 апреля 2019

Насколько я понимаю, 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 

Это может означать, что существует серьезная проблема или абсолютно ничего, в зависимости от вашего варианта использования.

Вы можете выбрать остановку функции, если вы предпочитаете, чтобы пользователи получали ее самостоятельно. И на самом деле некоторые люди защищают этот принцип . Я обычно стараюсь сделать свои пакеты максимально удобными, чтобы людям не приходилось бороться с ошибкой, которую они не понимают. В то же время я хочу сообщить им, что они могли совершить распространенную ошибку и могли бы исправить ее, если это было не то, что они собирались сделать.

3 голосов
/ 16 апреля 2019

В ответ на: кажется, что на самом деле ничего не происходит во время выполнения кода, за исключением того, что храните некоторые сообщения в предупреждениях (), на которые никто вообще не смотрит., Попробуйте выполнить это:

 why_warning<-function(x){ 
    if(is.numeric(x)){ 
       warning("x must be a string")
    } 
    print(x)
 }

Выполнение этого с:

why_warning(2)

Мы получаем:

[1] 2
Warning message:
In why_warning(2) : x must be a string

Короче говоря, предупреждение предназначено для подтверждения того, что есть проблемы, но они были "проигнорированы" и возвращен результат.Это особенно полезно для численных вычислений.

Сравните это с функцией ниже:

why_warning<-function(x){
  stopifnot(is.character(x))

  print(x)
}

Выше не будет "возвращать" любое значение, но остановит и выдаст ошибку:

Error in why_warning(2) : is.character(x) is not TRUE 

Поэтому, в зависимости от цели функции, предупреждение может быть именно таким: предупреждение.Тем не менее, это может означать, что любые полученные результаты являются ошибочными.

Более подробную информацию о warning вы можете найти в: ?warning.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...