При печати отслеживания стека и продолжении после того, как ошибка происходит в R

Я пишу некоторый код R, который называет другой код, который может перестать работать. Если это делает, я хочу распечатать отслеживание стека (для разыскивания, что пошло не так, как надо), то продолжите независимо. Однако traceback () функция только предоставляет информацию о неперехваченных исключениях. Я могу получить результат, который я хочу через довольно сложную, аккуратную конструкцию, включающую tryCatch и dump.frames, но есть ли не более легкий способ сделать это?

21
задан Alice Purcell 29 December 2009 в 15:07
поделиться

3 ответа

Попробовали ли вы установить

 options(error=recover)

? В камерах 'Software for Data Analysis' есть несколько полезных советов по отладке.

.
5
ответ дан 29 November 2019 в 20:32
поделиться

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

0
ответ дан 29 November 2019 в 20:32
поделиться

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

options(warn = 2, keep.source = TRUE, error = quote({
  # Debugging in R
  #   http://www.stats.uwo.ca/faculty/murdoch/software/debuggingR/index.shtml
  #
  # Post-mortem debugging
  #   http://www.stats.uwo.ca/faculty/murdoch/software/debuggingR/pmd.shtml
  #
  # Relation functions:
  #   dump.frames
  #   recover
  # >>limitedLabels  (formatting of the dump with source/line numbers)
  #   sys.frame (and associated)
  #   traceback
  #   geterrmessage
  #
  # Output based on the debugger function definition.

  # TODO: setup option for dumping to a file (?)
  # Set `to.file` argument to write this to a file for post-mortem debugging    
  dump.frames()  # writes to last.dump
  n <- length(last.dump)
  if (n > 0) {
    calls <- names(last.dump)
    cat("Environment:\n", file = stderr())
    cat(paste0("  ", seq_len(n), ": ", calls), sep = "\n", file = stderr())
    cat("\n", file = stderr())
  }

  if (!interactive()) q()
}))

PS: вам может не понадобиться warning=2 (предупреждения, преобразованные в ошибки)

.
19
ответ дан 29 November 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: