#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. Спасибо за подробный ответ. Использование сообщений определенно будет более полезным для моих целей.