Подтвердить что ты не робот

Break/exit script

У меня есть программа, которая выполняет некоторый анализ данных и составляет несколько сотен строк.

Очень рано в программе, я хочу сделать некоторый контроль качества, и если данных недостаточно, я хочу, чтобы программа завершалась и возвращалась в консоль R. В противном случае я хочу, чтобы остальная часть кода выполнялась.

Я пробовал break, browser и quit, и ни один из них не прекратил выполнение остальной части программы (и quit останавливает выполнение, а также полностью покидает R, что не то, что я хочу, чтобы произойти). В последнем случае я создаю оператор if-else, как показано ниже:

 if(n < 500){}
 else{*insert rest of program here*}

но это похоже на плохую практику кодирования. Я что-то пропустил?

4b9b3361

Ответ 1

Вы можете использовать функцию stopifnot(), если вы хотите, чтобы программа создала ошибку:

foo <- function(x) {
    stopifnot(x > 500)
    # rest of program
}

Ответ 2

Отмените конструкцию if-else:

if(n >= 500) {
  # do stuff
}
# no need for else

Ответ 3

Изменить: Кажется, что OP работает с длинным script, в этом случае нужно только обернуть часть script после контроля качества с помощью

if (n >= 500) {

.... long running code here

}

Если вы выйдете из функции, вы, вероятно, просто захотите return(), явно или неявно.

Например, явный двойной возврат

foo <- function(x) {
  if(x < 10) {
    return(NA)
  } else {
    xx <- seq_len(x)
    xx <- cumsum(xx)
  }
  xx ## return(xx) is implied here
}

> foo(5)
[1] 0
> foo(10)
 [1]  1  3  6 10 15 21 28 36 45 55
Под понятием return() подразумевается, что последняя строка выглядит так, как если бы вы сделали return(xx), но немного более эффективно отказаться от вызова return().

Некоторые считают использование многократного неправильного стиля возврата; в длинных функциях, отслеживая, где функция выхода может стать сложной или подверженной ошибкам. Следовательно, альтернативой является наличие единственной точки возврата, но изменение возвращаемого объекта с помощью предложения if () else (). Такая модификация foo() была бы

foo <- function(x) {
  ## out is NA or cumsum(xx) depending on x
  out <- if(x < 10) {
    NA
  } else {
    xx <- seq_len(x)
    cumsum(xx)
  }
  out ## return(out) is implied here
}

> foo(5)
[1] NA
> foo(10)
 [1]  1  3  6 10 15 21 28 36 45 55

Ответ 4

Не очень, но вот способ реализовать команду exit() в R, которая работает для меня.

exit <- function() {
  .Internal(.invokeRestart(list(NULL, NULL), NULL))
}

print("this is the last message")
exit()
print("you should not see this")

Только слегка протестировано, но когда я запускаю это, я вижу this is the last message, а затем script прерывается без сообщения об ошибке.

Ответ 5

Возможно, вы просто захотите прекратить выполнение длинного script в какой-то момент. то есть. например, вы хотите жестко закодировать exit() в C или Python.

print("this is the last message")
stop()
print("you should not see this")

Ответ 6

Вы можете использовать функцию pskill в пакете R "tools", чтобы прервать текущий процесс и вернуться в консоль. Конкретно, у меня есть следующая функция, определенная в файле запуска, который я запускаю в начале каждого script. Однако вы также можете скопировать его непосредственно в начале вашего кода. Затем вставьте halt() в любую точку вашего кода, чтобы остановить выполнение script на лету. Эта функция хорошо работает на GNU/Linux и, судя по документации R, она также должна работать на Windows (но я не проверял).

# halt: interrupts the current R process; a short iddle time prevents R from
# outputting further results before the SIGINT (= Ctrl-C) signal is received 
halt <- function(hint = "Process stopped.\n") {
    writeLines(hint)
    require(tools, quietly = TRUE)
    processId <- Sys.getpid() 
    pskill(processId, SIGINT)
    iddleTime <- 1.00
    Sys.sleep(iddleTime)
}

Ответ 7

Здесь:

if(n < 500)
{
    # quit()
    # or 
    # stop("this is some message")
}
else
{
    *insert rest of program here*
}

Оба quit() и stop (message) выйдут из вашего script. Если вы выберете script из командной строки R, то quit() также выйдет из R.