Как следует реализовать is.error () для R для выявления и анализа ошибок?

Я пытаюсь проверить, являются ли объекты результатом ошибок. в первую очередь возникает из-за цикла foreach () , который вызывает ошибку (хотя для тестирования кажется достаточно просто присвоить переменной simpleError () ), и я озадачен о том, как определить, когда это произошло: как я могу проверить, что данный объект на самом деле является ошибкой? Как только я определил, что это ошибка, что еще я могу извлечь, кроме сообщения? Возможно, я отсутствует кое-что о средствах обработки ошибок R, поскольку кажется необходимым написать функцию тестирования объекта ошибок de novo .

Вот два примера, один из которых использует foreach , с ] .errorhandling для аргумента pass . Я начал использовать его по умолчанию для крупномасштабной или автоматической обработки, в случае аномалии в срезе данных. Такие аномалии редки и не вызывают сбоя всего цикла for (особенно если эта аномалия возникает в конце, что, по-видимому, является поведением по умолчанию для моего murphysListSortingAlgorithm () ;-)). Вместо этого желательно post hoc обнаружение.

library(foreach)
library(doMC)
registerDoMC(2)
results = foreach(ix = 1:10, .errorhandling = "pass") %dopar%{
    if(ix == 6){
        stop("Perfect")
    } 
    if(ix == 7){
        stop("LuckyPrime")
    } else {
        return(ix)
    }
}

Для простоты вот очень простая ошибка (по определению):

a = simpleError("SNAFU")

Хотя, похоже, не существует такой команды, как .error () , а такие команды, как typeof () и mode () , кажутся бессмысленными, лучшее, что я нашел, - это использовать class () или атрибуты () , которые предоставляют атрибуты, указывающие на ошибку. Как я могу использовать их таким образом, чтобы гарантированно определить, что у меня есть ошибка, и полностью обработать эту ошибку? Например, $ message возвращает SNAFU , но $ call имеет значение NULL . Стоит ли ожидать, что я смогу извлечь что-нибудь полезное, скажем, из res [[6]] $ call ?


Примечание 1. Если у кого-то нет многоядерной функциональности для воспроизведения первого примера, Я должен отметить, что результаты [[6]] не то же самое, что simpleError ("Perfect") :

> b = simpleError("Perfect")
> identical(results[[6]], b)
[1] FALSE
> results[[6]]
<simpleError in eval(expr, envir, enclos): Perfect>
> b
<simpleError: Perfect>

Это демонстрирует, почему я не могу (очень наивно) проверить, является ли элемент списка ванильным simpleError .

Примечание 2. Мне известны try и tryCatch , и я использую их в некоторых контекстах. Однако я не совсем уверен, как их можно использовать для пост-обработки вывода, скажем, цикла foreach . Например, в первом примере объект приводит к объекту : мне не кажется смыслом обрабатывать его элементы с помощью оболочки tryCatch . Что касается правой части операции, то есть цикла foreach () , я также не уверен, что tryCatch будет делать то, что я задумал. Я могу использовать его, чтобы поймать ошибку, но я полагаю, что мне нужно получить сообщение и вставить обработку в этот момент.Я вижу две проблемы: каждый цикл необходимо обернуть с помощью tryCatch () , что отрицает часть аргумента .errorhandling , и я по-прежнему не могу впоследствии выполнить постобработку ] results объект. Если это единственный способ выполнить эту обработку, то это решение, но это означает, что ошибки нельзя идентифицировать и обрабатывать так же, как и многие другие объекты R, такие как матрицы, векторы, фреймы данных и т. Д.


Обновление 1. Я добавил дополнительный триггер остановки в цикл foreach , чтобы выдавать два разных сообщения для идентификации и анализа на случай, если это будет полезно.

Обновление 2. Я выбираю ответ Ричи Коттона. Это кажется наиболее полным объяснением того, что мне следует искать, хотя для полной реализации требуется несколько других фрагментов кода (и последняя версия R). Наиболее важно то, что он указывает на то, что нам нужно помнить о двух типах ошибок, что особенно важно при тщательности. См. Также комментарии и ответы других, чтобы полностью разработать собственную тестовую функцию is.error () ; ответ, который я дал, может быть полезным началом при поиске ошибок в списке результатов, а код Ричи - хорошая отправная точка для тестовых функций.

16
задан Mr Lister 9 May 2012 в 18:09
поделиться