Ответ 1
Вы можете использовать функцию stopifnot()
, если вы хотите, чтобы программа создала ошибку:
foo <- function(x) {
stopifnot(x > 500)
# rest of program
}
У меня есть программа, которая выполняет некоторый анализ данных и составляет несколько сотен строк.
Очень рано в программе, я хочу сделать некоторый контроль качества, и если данных недостаточно, я хочу, чтобы программа завершалась и возвращалась в консоль R. В противном случае я хочу, чтобы остальная часть кода выполнялась.
Я пробовал break
, browser
и quit
, и ни один из них не прекратил выполнение остальной части программы (и quit
останавливает выполнение, а также полностью покидает R, что не то, что я хочу, чтобы произойти). В последнем случае я создаю оператор if-else
, как показано ниже:
if(n < 500){}
else{*insert rest of program here*}
но это похоже на плохую практику кодирования. Я что-то пропустил?
Вы можете использовать функцию stopifnot()
, если вы хотите, чтобы программа создала ошибку:
foo <- function(x) {
stopifnot(x > 500)
# rest of program
}
Отмените конструкцию if-else:
if(n >= 500) {
# do stuff
}
# no need for else
Изменить: Кажется, что 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
Не очень, но вот способ реализовать команду 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 прерывается без сообщения об ошибке.
Возможно, вы просто захотите прекратить выполнение длинного script в какой-то момент. то есть. например, вы хотите жестко закодировать exit() в C или Python.
print("this is the last message")
stop()
print("you should not see this")
Вы можете использовать функцию 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)
}
Здесь:
if(n < 500)
{
# quit()
# or
# stop("this is some message")
}
else
{
*insert rest of program here*
}
Оба quit() и stop (message) выйдут из вашего script. Если вы выберете script из командной строки R, то quit() также выйдет из R.