У меня есть следующий код на R, и я считаю, что он должен немедленно сломаться. Вместо этого он выполняется до тех пор, пока не будет достигнуто число попыток. Но попытка сделать это вручную «status <- run_request_and_writedb()» делает статус TRUE, а is.null(status ) оценивается как FALSE, что должно прервать цикл while, если не выполняются оба условия. Чего мне здесь не хватает или я в корне неправильно понимаю условия?
run_request_and_writedb <- function() {
return(TRUE)
}
## Try the function a few times
# return value is null
status <- NULL
# number of attempts at start
attempt <- 1
number_of_retries <- 3
while( is.null(status) && attempt <= number_of_retries ) {
try(
status <- run_request_and_writedb()
)
attempt <- attempt + 1
Sys.sleep(10)
}
Речь не идет о завершении цикла while
, но Sys.sleep(10)
дает вам иллюзию, что цикл while
бесконечен (если только вы не проявите достаточно терпения и не подождите 10
секунд).
Описание
Приостановить выполнение выражений R на указанное время интервал.
Применение
Sys.sleep(time)
Аргументы
time
Интервал времени для приостановки выполнение в течение, в секундах.
Когда вы удалите Sys.sleep(10)
, вы увидите, что ваш код выходит из цикла.
## Try the function a few times
# return value is null
status <- NULL
# number of attempts at start
attempt <- 1
number_of_retries <- 3
while (is.null(status) && attempt <= number_of_retries) {
status <- run_request_and_writedb()
attempt <- attempt + 1
}
или добавьте break
непосредственно перед Sys.sleep(10)
## Try the function a few times
# return value is null
status <- NULL
# number of attempts at start
attempt <- 1
number_of_retries <- 3
while (is.null(status) && attempt <= number_of_retries) {
status <- run_request_and_writedb()
attempt <- attempt + 1
break
Sys.sleep(10)
}
... Instead it runs until number_of_retries is reached ...
Я не думаю, что проблема со сном.
Вы правы, он не запускается до тех пор, пока не будет достигнуто число попыток, но команда сна меня оттолкнула. Может быть, мне стоит взять что-нибудь себе
@user2974951 user2974951 Я думаю, что OP недостаточно терпелив до конца sleep
, поэтому это было понято как сбой в завершении цикла.
У меня сложилось впечатление, что цикл while должен немедленно прерваться, но он завершает текущий запуск.
@Sebastian Если вы хотите, чтобы он вышел немедленно, вам следует поставить break
перед Sys.sleep()
, см. мое обновление
Вы уверены, что вызов функции успешен? Попробуйте удалить try.