Как обрабатывать R предупреждений в цикле?

#r

#r

Вопрос:

У меня есть вариант использования, когда мне нужен некоторый поток управления, основанный на количестве предупреждений, сгенерированных некоторым фрагментом кода:

 # clear all warnings 
assign("last.warning", NULL, envir = baseenv())

for (i in 0:100) {
   # call warning-generating code here

   x <- warnings()
   cat(paste('There were',length(x),'warnings generatedn'))
   if (length(x)>10) {
      # do something
   }

   # clear all warnings again
   assign("last.warning", NULL, envir = baseenv())
}
  

По какой-то причине этот код не работает. Код всегда будет выдавать There were 0 warnings generated … почему? Если я запускаю рассматриваемый код генерации предупреждений вне цикла, он выдает ненулевое переменное количество предупреждений…

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

1. Прочитайте help("options") (прокрутите до warn опции). last.warning Объект создается только тогда, когда возвращается функция верхнего уровня (здесь for цикл). Я бы, вероятно, изучил tryCatch и связанные функции (см. help("tryCatch") ), чтобы решить эту проблему.

Ответ №1:

Не уверен, что это то, к чему вы стремитесь?

 # clear all warnings 
assign("last.warning", NULL, envir = baseenv())
x <- rep(NA, 100)
for (i in 1:100) { 
 # call warning-generating code here
  x[i] <- warning()
  cat(paste('There were',sum(!is.na(x)),'warnings generatedn'))
  if (sum(!is.na(x))>10) {
# do something
  }
  # clear all warnings again
  assign("last.warning", NULL, envir = baseenv()
}
  

Похоже на опечатку — afaik warnings () просто покажет вам предупреждения, которые все еще равны нулю на этом этапе цикла; warning() сгенерирует.