2013-10-01 4 views
10

Я запускаю симуляционное исследование в Р. Случайно, мое симуляционное исследование выдает сообщение об ошибке. Когда я реализовал свое симуляционное исследование в функции, симуляция прекращается, когда появляется это сообщение об ошибке. Я знаю, что это плохая практика, чтобы подавлять ошибки, но в этот момент мне нет другого выбора, кроме как подавить ошибку, а затем продолжить следующую симуляцию до тех пор, пока общее количество имитаций, которые мне нравится запускать. Для этого мне нужно подавить сообщение об ошибке R.Подавить сообщение об ошибке в R

Чтобы сделать это, я пробовал разные вещи:

library(base64) 
suppressWarnings 
suppressMessages 
options(error = expression(NULL)) 

В первых двух вариантах, только предупреждения и сообщения являются suprressed, так что нет никакой помощи. Если я правильно понял, в последнем случае все сообщения об ошибках следует избегать. Однако это не помогает, функция по-прежнему останавливается с сообщением об ошибке.

Есть ли у кого-нибудь идеи, почему это не работает так, как я ожидаю, что он сработает? Я искал интернет для решений, но мог найти только вышеупомянутые способы. В функции я запускаю свою симуляцию, часть кода анализируется внешней программой JAGS (Gibbs sampler), и сообщение об ошибке создается этим анализом. Может ли это быть, где это пойдет не так?

Обратите внимание, что мне не нужно подавать определенное/конкретное сообщение об ошибке, так как никаких других сообщений об ошибках не создано, это «достаточно хорошо», чтобы иметь опцию, которая подавляет только все сообщения об ошибках.

Спасибо за ваше время и помощь!

+1

Проверить ' "попробовать"'. –

+0

Спасибо за ваш быстрый ответ. Я использовал try (симуляция (x, y, z)) (в скобках моя собственная функция), но это тоже не сработало. Я также использовал опции (show.error.messages = FALSE) без успешных действий. – Inga

+0

Если вы не указали нам свой код или точные ошибки, как мы можем помочь? –

ответ

4

Существует большая разница между подавлением сообщения и подавляя ответ на ошибку. Если функция не может выполнить свою задачу, она по необходимости будет возвращать ошибку (хотя некоторые функции имеют аргумент командной строки для принятия некоторых других действий в случае ошибки). Что вам нужно, как предложил Zoonekynd, - использовать try или trycatch, чтобы «инкапсулировать» ошибку, чтобы ваш основной поток программы продолжался даже при сбое функции.

+1

Спасибо за ваши ответы. Я не предоставлял свой код, поскольку он состоит из функции, которая вызывает другую функцию из источника в цикле for, поэтому код довольно длинный. Более того, как становится ясно в ответе Карла Витфофля, моя проблема была промахом: я думал, что варианты и функции, которые я пробовал (см. Выше), предположили, чтобы подавить ** ответ ** на ошибку. В конце концов, то, что сработало для меня, вызывало функцию, где возникает ошибка с try(), а затем с помощью следующей опции в цикле for, откуда я вызываю функцию. – Inga

+0

@Inga: У меня такая же или аналогичная проблема, но я не могу поймать ваше решение. Было бы неплохо, если бы вы предоставили минимальный пример для своего решения. – giordano

+0

Конечно. Я вызвал функцию в цикле for -N раз. Функция выполняла анализ (JAGS), но иногда происходила ошибка. Чтобы предотвратить это, я скорректировал цикл for следующим образом: for (i in 1: N) { Результаты [[i]] <- try (Jags.Analysis (Npairs = Npairs ...) if (класс (результаты [[i]]) == "try-error") next – Inga

0

Как было предложено в предыдущем решении, вы можете использовать функции try или tryCatch, которые будут инкапсулировать ошибку (больше информации в Advanced R). Однако они не будут подавлять сообщение с сообщением об ошибке до stderr по умолчанию.

Этого можно достичь, установив свои параметры. Для try, комплект silent=TRUE. Для tryCatch комплект error=function(e){}.

Примеры:

o <- try(1 + "a") 
> Error in 1 + "a" : non-numeric argument to binary operator 
o <- try(1 + "a", silent=TRUE) # no error printed 

> o <- tryCatch(1 + "a") 
Error in 1 + "a" : non-numeric argument to binary operator 
> o <- tryCatch(1 + "a", error=function(e){}) 
Смежные вопросы