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?
Кто-нибудь может порекомендовать способ заставить это работать с раковиной ()?
В качестве альтернативы, если вы знаете какой-то другой способ получить желаемый результат (список / таблица сообщений об ошибках / предупреждений и их расположение в коде), я весь в ушах.