Ограничение времени обработки функции в цикле R for - PullRequest
7 голосов
/ 28 декабря 2011

Я хочу применить функцию («foo» для этого объяснения), чтобы преобразовать вектор данных в другое значение.Эта функция принимает данные в качестве входных данных и требует отправки форм на веб-страницы.Иногда это происходит быстро, а иногда - долго.Я хотел бы запустить цикл for (или эквивалентную функцию apply) таким образом, чтобы пропустить элементы, которые занимают слишком много времени.Я попытался ограничить время выполнения цикла перед переходом к следующим 5 секундам, используя следующее:

pb <- txtProgressBar(min = 1, max = 100, style = 3)
storage <- matrix(nrow = sample.length, ncol = 2)

for(i in 1:100){  
     s <- Sys.time()  
     storage[i,] <- try(foo(data.vec[i]), TRUE)  
     if (Sys.time() - s >5) {next}  
     # update progress bar  
     setTxtProgressBar(pb, i)  
}  
close(pb)  

Я думаю, что я не должен понимать, как применять условие «следующий» впетля.искал, чтобы найти более четкое объяснение, но не получил никакой удачи здесь.

1 Ответ

12 голосов
/ 28 декабря 2011

withTimeout() из пакета R.utils вместе с tryCatch() может обеспечить более чистое решение.

Например:

require(R.utils)

for(i in 1:5) {
    tryCatch(
        expr = {
            withTimeout({Sys.sleep(i); cat(i, "\n")}, 
                         timeout = 3.1)
            }, 
        TimeoutException = function(ex) cat("Timeout. Skipping.\n")
    )
}

# 1 
# 2 
# 3 
# Timeout. Skipping.
# Timeout. Skipping.

В приведенном выше искусственном примере:

  • Первый аргумент withTimeout() содержит код, который будет оцениваться в каждом цикле.

  • Аргумент timeout для withTimeout() устанавливает ограничение по времени в секундах.

  • Аргумент TimeoutException для tryCatch() принимает функцию, которая должна быть выполнена, когда время итерации цикла истекло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...