сценарий разрыва / выхода


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

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

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

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

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

8 56

8 ответов:

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

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

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

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

Edit: кажется, что OP запускает длинный скрипт, в этом случае нужно только обернуть часть скрипта после контроль качества

if (n >= 500) {

.... long running code here

}

если вырваться из функции, вы, вероятно, просто хочу!--3-->, явно или неявно.

например, явное двойное возвращение

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

By 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

не очень, но вот способ реализации 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 и затем скрипт прерывается без какого-либо сообщения об ошибке.

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

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

можно использовать

Это старый вопрос, но нет чистого решения. Это, вероятно, не отвечает на этот конкретный вопрос, но те, кто ищет ответы на "как изящно выйти из сценария R", вероятно, приземлятся здесь. Похоже, что разработчики R забыли реализовать функцию exit (). Во всяком случае, трюк, который я нашел:

continue <- TRUE

tryCatch({
     # You do something here that needs to exit gracefully without error.
     ...

     # We now say bye-bye         
     stop("exit")

}, error = function(e) {
    if (e$message != "exit") {
        # Your error message goes here. E.g.
        stop(e)
    }

    continue <<-FALSE
})

if (continue) {
     # Your code continues here
     ...
}

cat("done.\n")

в основном, вы используете флаг, чтобы указать продолжение или нет указанного блока кода. Тогда вы используете stop() функция для передачи a настроенное сообщение обработчику ошибок a

здесь:

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

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