Я пишу некоторый код R, который называет другой код, который может перестать работать. Если это делает, я хочу распечатать отслеживание стека (для разыскивания, что пошло не так, как надо), то продолжите независимо. Однако traceback () функция только предоставляет информацию о неперехваченных исключениях. Я могу получить результат, который я хочу через довольно сложную, аккуратную конструкцию, включающую tryCatch и dump.frames, но есть ли не более легкий способ сделать это?
Попробовали ли вы установить
options(error=recover)
? В камерах 'Software for Data Analysis' есть несколько полезных советов по отладке.
. Я думаю, что вам нужно будет использовать tryCatch()
. Вы можете делать все, что угодно в функции tryCatch(), так что мне непонятно, почему ты рассматриваешь это как сложное дело. Может быть, выложите свой пример кода?
Я написал этот код около недели назад, чтобы помочь мне отследить ошибки, которые приходят в основном из неинтерактивных 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 (предупреждения, преобразованные в ошибки)
.