tryCatch не выводит предупреждение, если предупреждение не заключено в ()

#r #try-catch

#r #попробуйте-catch

Вопрос:

tryCatch не выводит предупреждения, если предупреждение не заключено в квадратные скобки.

 tryCatch(
  {
  print(wd)
},
error=function(e){
 (warning(sprintf('Watch out %s',e)))}
)
  

выводит предупреждение «»Остерегайтесь ошибки при печати (wd): объект ‘wd’ не найден n»

но

 tryCatch(
   {
 print(wd)
    },
    error=function(e){
     warning(sprintf('Watch out %s',e)) }
    )
  

не выводит.

Есть идеи, почему? Как я могу это исправить? Этот пример является минимальным примером. У меня есть гораздо большая функция, которая выполняется через цикл, и я не обязательно хочу останавливать цикл, если есть ошибка, но я хочу видеть предупреждения.

Ответ №1:

Для вашего цикла вы, вероятно, захотите использовать message или cat , например:

 for (i in 1:2)
    tryCatch(print(wd),
             error = function(e) message(sprintf('Watch out %s',e)))
## Watch out Error in print(wd): object 'wd' not found
## 
## Watch out Error in print(wd): object 'wd' not found
  

Чтобы понять, что происходит в ваших двух версиях:

  • warning ничего не печатает. Это сигнализирует о предупреждении, которое обработчик может напечатать немедленно или организовать для печати позже.

  • Если обработчик не выполняет нелокальную передачу управления, например, в tryCatch , то ?warning сообщает это о значении, которое он возвращает:

Значение:

 The warning message as ‘character’ string, invisibly.
  
  • Если выражение возвращает результат невидимым образом, заключите его в круглые скобки
    делает результат видимым. Файлы справки часто используют идиому

     (x <- foo(y))
      

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

Комментарии:

1. Спасибо за подробный ответ. Использование сообщений определенно будет более полезным для моих целей.