Функции и try () в R

Все еще борется с R, особенно с обработкой ошибок:

Если я использую:

result <- try(sqlSave(ch,df,tablename="tblTest"))

, я могу использовать:

if (class(result) != "try-error")

, чтобы проверить, что-то пошло не так. Нет проблем.

Но если я использую , попробуйте в сочетании с функцией, она не будет работать так, как я ожидал:

 result <- try(ch<-odbcConnect("TEST"))

дает «-1» для результата и «целое число» для class (result)

Так что мне следует использовать

ch<-odbcConnect("TEST")
if (ch != -1)

и использовать geterrmessage () для сообщения об ошибке?

15
задан rcs 20 February 2012 в 21:19
поделиться

1 ответ

Если внимательно прочитать сообщение об ошибке, то можно увидеть, что odbcConnect выдает предупреждение. Ошибка генерируется драйверами ODBC и не является ошибкой в try смысле (geterrmessage() тоже не сработает).

Вы можете использовать tryCatch, чтобы справиться с этим, например:

tryCatch(odbcConnect("TEST"), warning=function(w) print("FAIL!"))

Еще немного пояснений:
-1 - это результат работы функции odbcDriverConnect. Если вы посмотрите на код, то там есть строки

stat <- .Call(C_RODBCDriverConnect, as.character(connection), 
        id, as.integer(believeNRows), as.logical(readOnlyOptimize))
if (stat < 0L) {
     warning("ODBC connection failed")
     return(stat)
}

Таким образом, вы заканчиваете без ошибок (и с предупреждением) и с целочисленным кодом с уровня C. На самом деле этот код возвращается и при успешном подключении (но тогда он равен 1). Когда ошибок нет, класс result не может быть try-error.
Это не проблема try и функций, а специфика именно этой функции (odbcDriverConnect).

Вы, конечно, можете использовать это поведение, как в вашем примере

ch <- odbcConnect("TEST")
if (ch != -1)

С tryCatch вы можете сделать

tryCatch(ch<-odbcConnect("TEST"), warning=function(w) print("FAIL!"))

что создает ch переменную при успехе и печатает сообщение при неудаче.
Или

ch <- tryCatch(odbcConnect("TEST"), warning=function(w) {print("FAIL!");return(NA)})

которая всегда создает переменную ch, но в случае неудачи имеет значение NA.

10
ответ дан 1 December 2019 в 04:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: