Для цикла с ограничением по времени выполнения шага - PullRequest
2 голосов
/ 28 марта 2019

Я хочу наложить ограничение на время выполнения для каждого шага цикла for. Проще говоря, если шаг не завершился за 10 секунд, тогда перейдите на next.

Чтобы быть более конкретным, вот код.

myComplicatedFunction <- function(obj, ...) { <some code here> }
x # something to process
x_result <- vector(mode = "list", length = length(x))
for (i in seq_along(x)) {
    x_result[[i]] <- 
        processNotMoreThanXSeconds(
            givenTime = 10,
            myComplicatedFunction(x[i]),
            didNotComplete = function() "Time's up!"
        )
}

У меня вопрос, как объявить такую ​​функцию processNotMoreThanXSeconds?

1 Ответ

5 голосов
/ 28 марта 2019

Вы можете использовать setTimeLimit (это часть базы R):

setTimeLimit({

  Sys.sleep(7)

}, elapsed = 5)

Если ограничение по времени достигнуто, функция выдаст ошибку (например, если вы запустите вышеуказанное, обработка займет 7 секунд, но ограничение будет 5). Вы можете связать это с try, чтобы обработать ошибку и продолжить цикл:

myerror <- try({

   setTimeLimit({

     Sys.sleep(7)

   }, elapsed = 5)
}, silent = TRUE)

class(myerror)
#[1] "try-error"

Затем используйте оператор if-else, чтобы проверить, была ли ошибка, и продолжайте. Что-то вроде:

if (class(myerror) == 'try-error') {
  next
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...