2015-10-28 3 views
3

Я использую проверки данных в моем коде, например, следующий:остановка выполнения кода в R

if (...) 
stop(paste('Warning: Weights do not sum up to 1') 

Проблема в том, что если условие истинно, и предупреждение появляется в консоли, код не прекратить бег. Если вы скрыты в длинном коде, нужно всегда прокручивать его на выходе консоли, чтобы увидеть, появилось ли предупреждение.

Есть ли способ рассказать R, чтобы перехватить ВСЕ код, когда появляется предупреждение о прекращении, и условие истинно? Что-то вроде BREAK?

Я не являюсь воспроизводимым примером здесь, потому что мой код довольно длинный.

EDIT:

Вот мини-пример:

Когда я исполняю

a=1+2 

if (a==3) 
    stop('a equals 3') 


b=4 

1+1 

Я хотел бы, чтобы остановить после печати

> a=1+2 
> 
> if (a==3) 
+ stop('a equals 3') 
Error: a equals 3 

но R выполняет все, также последняя часть:

> a=1+2 
> 
> if (a==3) 
+ stop('a equals 3') 
Error: a equals 3 
>   
>   
> b=4 
> 
> 1+1 
[1] 2 
+4

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

+1

Итак, вы источник что-то вроде 'stop (" foo_error "); print (iris) 'и хотите избежать эха/оценки« print (iris) »? 'stop' предназначен для использования в функциях, и вы можете обернуть свой код в функции. Например, 'fun <- function() {stop (" foo_error "); печать (радужная оболочка)}; весело() '. – Roland

+2

Вы делаете «источник все» или похожий? – sdgfsdh

ответ

4

В соответствии с stop, он только прекращает оценку текущего. Хотя я согласен с Roland's comment, чтобы инкапсулировать ваш код в значащие части с помощью функций, быстрый взлом будет заключаться в том, чтобы обернуть весь ваш текущий код в фигурные скобки. Это заставит R-парсер представать как одно выражение.

R> # without curly braces 
R> x <- 1 
R> y <- 2 
R> if (x < y) 
+ stop("x < y") 
Error: x < y 
R> print("hello") 
[1] "hello" 
R> 
R> # with curly braces 
R> { 
+ x <- 1 
+ y <- 2 
+ if (x < y) 
+  stop("x < y") 
+ print("hello") 
+ } 
Error: x < y 
+0

Привет, Джошуа, спасибо за ваш ответ, ваш метод предоставляет мне только сообщение об ошибке, но код все еще полностью запущен, мы просто не видим его, потому что он внутри функции ?! – fuji2015

+0

@ fuji2015: нет, он не работает, и он не работает. Он находится в выражении, а остальная часть выражения пропускается, если вызывается 'stop'. –

+0

Моя ошибка, я посмотрел сообщение ниже. Конечно, в вашем ответе нет функции. Благодаря! – fuji2015

0

Если я вас правильно понял, это, кажется, не поведение по умолчанию R.

Так что я думаю, что есть какое-то изменение обработчика остановки. Вы можете попробовать позвонить options(stop=NULL) перед запуском кода. См the doc:

поведения по умолчанию (NULL ошибки обработчик) в интерактивном режиме является , чтобы вернуться к подсказке верхнего уровня или браузеру верхнего уровня, а также в неинтерактивного пользования (эффективно) вызов д («нет», статус = 1, runLast = FALSE).

По крайней мере, следующий код работает в моем случае (R 3.2.1):

funErr <- function() { 
    if (TRUE) 
     stop("now") 

    print("after stop") 
} 

funCaller <- function() { 
    print("before call") 

    funErr() 

    print("after call") 
} 


print("before global") 

# Also possible to uncomment the following to test the `stop()` 
# inside of `funErr()` 
if(TRUE) 
    stop("global error") 

funCaller() 
Смежные вопросы