2012-02-28 6 views
4

Когда вызов существует из нескольких строк, потенциальная ошибка включает только первую строку match.call(), приводящую к некоторой утерянной информации и неполному предложению. Простой пример:переопределение сообщений об ошибках R

#proper error message: 
runif(n=1, k=5) 

#incomplete error message: 
runif(n=1, k={5}) 

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

ответ

3

У меня был пойти на исследование объект ошибки в настройке tryCatch через:

tryCatch(runif(n=1,k={5}), 
      error = function(e) recover()) 

А потом выбрал 4-ю среду (value[[3]](cond)) для изучения e.

я заметил, что e$call был:

Browse[1]> e$call 
runif(n = 1, k = { 
    5 
}) 

Таким образом, кажется, что сообщение об ошибке просто использует эту первую строку.

Вы можете свернуть все линии вместе с:

Browse[1]> paste(deparse(e$call),collapse='') 
[1] "runif(n = 1, k = { 5})" 

Таким образом, вы можете попробовать что-то вроде:

tryCatch(runif(n=1,k={5}), 
      error = function(e) { 
      cat(sprintf('Error in %s: %s\n', 
       paste(deparse(e$call),collapse=''), 
       e$message)) 
      }) 

Но это не исправить сообщение об ошибке сам, только вызов ведущим до этого:

ошибки в runif (п = 1, K = {5}): неиспользуемый аргумент (ов) (к = {

Таким образом, «Ошибка в xxx» завершена, но «неиспользуемый аргумент xxx» по-прежнему отсутствует. Это начало, но не все так.

Я не уверен, как улучшить это (и мне также интересно узнать, возможно ли это).

+0

Кажется, что появляется сообщение об ошибке из внутренней функции geterrmessage; если он усекается там (что кажется), вероятно, было бы довольно сложно исправить сообщение об ошибке. См. Функцию 'do_geterrmessage' в https://svn.r-project.org/R/branches/R-2-14-branch/src/main/errors.c для кода внутренней функции. – Aaron