2014-01-24 3 views
1

Я пытаюсь получить сообщение об обработке ошибок в R. Из чтения документов я не могу найти четкое определение правильного синтаксиса.Обработка ошибок в синтаксисе R: tryCatch()

Вот самодостаточными пример:

foo <- function(dat) { 
    print('Calling foo()') 
    print(dat[,'r1']) 
    print(dat[,'r2']) 
    print(dat[,'r3']) 
    print('Finished foo()') 
    return(dat$r3) 
} 

bar <- function(dat) { 
    print('Calling bar()') 
    print(dat[,'r1']) 
    print(dat[,'r2']) 
    print('Finished bar()') 
    return(dat$r2) 
} 

d1 <- data.frame(r1 = 1:10, r2 = 11:20, r3 = 21:30) 
d2 <- d1[c("r1", "r2")] 

print('Starting') 
print('trying d1') 
myVal1 <- tryCatch(foo(d1), error = bar(d1)) 
print('finished d1') 
print('trying d2') 
myVal2 <- tryCatch(foo(d2), error = bar(d2)) 
print('finished d2') 
print('Done') 

Ожидаемый результат:

[1] "Starting" 
[1] "trying d1" 
[1] "Calling foo()" 
[1] 1 2 3 4 5 6 7 8 9 10 
[1] 11 12 13 14 15 16 17 18 19 20 
[1] 21 22 23 24 25 26 27 28 29 30 
[1] "Finished foo()" 
[1] "finished d1" 
[1] "trying d2" 
[1] "Calling bar()" 
[1] 1 2 3 4 5 6 7 8 9 10 
[1] 11 12 13 14 15 16 17 18 19 20 
[1] "Finished bar()" 
[1] "finished d2" 
[1] "Done" 

Фактический выход:

[1] "Starting" 
[1] "trying d1" 
[1] "Calling bar()" 
[1] 1 2 3 4 5 6 7 8 9 10 
[1] 11 12 13 14 15 16 17 18 19 20 
[1] "Finished bar()" 
[1] "Calling foo()" 
[1] 1 2 3 4 5 6 7 8 9 10 
[1] 11 12 13 14 15 16 17 18 19 20 
[1] 21 22 23 24 25 26 27 28 29 30 
[1] "Finished foo()" 
[1] "finished d1" 
[1] "trying d2" 
[1] "Calling bar()" 
[1] 1 2 3 4 5 6 7 8 9 10 
[1] 11 12 13 14 15 16 17 18 19 20 
[1] "Finished bar()" 
[1] "Calling foo()" 
[1] 1 2 3 4 5 6 7 8 9 10 
[1] 11 12 13 14 15 16 17 18 19 20 
Error in tryCatchOne(expr, names, parentenv, handlers[[1L]]) : 
    attempt to apply non-function 

Мои вопросы:

  1. Почему это tryCatch() звонок в конечном итоге работает обе функции?

  2. Почему я могу получить сообщение об ошибке выше?

  3. Неужели у меня такой синтаксис: tryCatch(someFunction(), error = someOtherFunction())?

Спасибо!

+0

Вы можете найти http://adv-r.had.co.nz/Exceptions-Debugging.html#condition-handling полезную – hadley

ответ

2

error хочет получить функцию. Вы передали выражение, которое является результатом оценки функции в аргументе. Кроме того, error не передает фрейм данных bar. Текст ошибки передается.

Замена этого:

myVal2 <- tryCatch(foo(d2), error = bar(d2)) 

с этим:

myVal2 <- tryCatch(foo(d2), error = function(e) { cat('In error handler\n'); print(e); e }) 

результаты такого поведения:

[1] "Calling foo()" 
[1] 1 2 3 4 5 6 7 8 9 10 
[1] 11 12 13 14 15 16 17 18 19 20 
In error handler 
<simpleError in `[.data.frame`(dat, , "r3"): undefined columns selected> 

Обратите внимание, что обработчик вызывается. И myVal2 устанавливается в результате обработчика ошибок:

> myVal2 
<simpleError in `[.data.frame`(dat, , "r3"): undefined columns selected> 
+1

Вы спас мою работу ! Благодаря! – akshaynagpal

Смежные вопросы