Как "выкинуть" ошибку в R? У меня есть функция, которая принимает фрейм данных и некоторые имена столбцов и делает с ними что-то. Если столбцы не существуют, я хочу, чтобы функция остановилась и остановила все функции в зависимости от нее.
Я смотрел recover
и browse
и , traceback
но, а, казалось, что они близки , но не то , что я ищу.
r
error-handling
вилка
источник
источник
Ответы:
Смотрите
help(tryCatch)
:а затем в разделе "См. также":
так что вы, наверное, захотите
stop
.источник
traceback()
после ошибки, чтобы увидеть, что пошло не так). Использованиеstop
вerror
аргументе oftryCatch
приведет к нарушению трассировки. Однакоfinally
аргумент позволит создать дополнительное сообщение и сохранить полезность трассировки. Не совсем по теме, но, как я считаю, достаточно важным, чтобы оправдать несколько минусов и угрозу модерации, которая выбросит этот комментарий из окна. :-)Простой пример:
f <- function(a, b){ if (a == 0){ stop("error message") } }
источник
Помимо базовых функций, которые упоминает Дирк:
Пакет R.oo имеет дополнительные функции обработки исключений, в том числе функцию throw (), которая очень полезна. Вы можете поймать исключения с помощью обычных функций try или trycatch:
> try(throw("Division by zero.")); print("It's ok!"); Error: [2009-10-22 10:24:07] Exception: Division by zero. [1] "It's ok!"
Вы можете прочитать об этом здесь: http://www1.maths.lth.se/help/R/R.oo/
источник
plot
отображает функцию,try
stop
warn
все работает так, как вы ожидаете, и почти все, что я хочу сделать, - это однострочник.На самом деле функция
stopifnot
очень удобна для реализации проверки работоспособности в вашем коде. Он принимает несколько логических выражений и возвращает ошибку, если какое-либо из них оказывается ложным.Пример: чтобы проверить, существует ли столбец «c» во фрейме данных «df»:
Это вызовет следующую ошибку:
Error: !is.null(df$c) is not TRUE
источник
Вы можете проверить, существует ли столбец, и сделать все, что хотите.
Предположим, что
data.frame
именованныйdf1
и проверяющий,col1
существует ли столбец :if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")
или
if(! any(grepl('^col1$',colnames(df1)))) return(-1)
Например
источник