R: Sink(type="message") для сообщения об ошибках - могу ли я получить номер строки?

TL;DR: я использую sink() для регистрации ошибок во время выполнения скрипта и сохранения их в кадре данных, который можно просмотреть после запуска, чтобы выделить ошибки. Я хотел бы, чтобы можно было включить номер строки ошибки, если это возможно.

'

Длинная версия: я пишу сценарий R для обработки национальных наборов данных о погоде, которые иногда содержат аномалии - отсутствующие данные, неожиданные символы и т. Д. Возможно, что несоответствия в данных могут вызвать ошибки в сценарии, что хорошо для меня, так как программист - я могу их идентифицировать и исправить. Тем не менее, моя конечная цель состоит в том, чтобы сделать его широко применимым к любому национальному набору данных о погоде - это означает, что он может использоваться людьми с небольшим знанием R. Сценарий в настоящее время ~700 строк и будет становиться немного длиннее, с рядом пользовательских функций. Это делает просмотр истории консоли довольно утомительным, особенно для начинающих пользователей R.

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

Как написано, мой код ниже. Я в основном работаю в RStudio, поэтому запускаю это, вставляя блок в консоль.

 # Method accesed online Nov 24, 2016, at:
 # http://stackru.com/questions/11666086/output-error-warning-log-txt-file-when-running-r-script-under-command-line
 setwd(tempdir()) # tempdir() creates names for temporary files

 # Capture messages and errors to a file
 zz=file("all.Rout",open="wt") # file() creates a file connection and opens it 
                               #  in wt="write text mode".
 sink(zz,type="message") # sink diverts R output to a connection - in this case, the error log, zz

 # test out some error samples (4)
 try(log("a")) # try runs an expression and allows user code to handle error-recovery
 z x a # try() is not necessary - any error will be flagged and entered to the log
 mean()
 sds(42)

 # Display log file
 readLines("all.Rout")
 error.log=data.frame(readLines("all.Rout")) # write these to an error log DF

 # Reset sink, close connection
 sink(type="message") # this prevents diversion of messages -
                      # they will now appear in console, as default
 close(zz) # close the error log connection
 remove(zz) # blank from mem

 # OK, this is good - but can I get line numbers to output to the DF?

Кто-нибудь может порекомендовать способ заставить это работать с раковиной ()?

В качестве альтернативы, если вы знаете какой-то другой способ получить желаемый результат (список / таблица сообщений об ошибках / предупреждений и их расположение в коде), я весь в ушах.

0 ответов

Другие вопросы по тегам