Обертка для циклов FOR с прогресс-баром

Мне нравится использовать индикатор прогресса при медленном выполнении циклов для. Это легко сделать с помощью нескольких помощников, но мне нравится tkProgressBar из пакета tcltk.

Небольшой пример:

pb <- tkProgressBar(title = "Working hard:", min = 0, max = length(urls), width = 300)
for (i in 1:300) {
    # DO SOMETHING
    Sys.sleep(0.5)
    setTkProgressBar(pb, i, label=paste( round(i/length(urls)*100, 0), "% ready!"))
}
close(pb)

И мне бы хотелось создать небольшую функцию для хранения в моем .Rprofile, названном в forp (как: для цикла с прогрессбаром), для вызова точно так же как for, но с автоматическим добавлением прогресса бара - но, к сожалению, понятия не имею, как реализовать и захватить часть функции цикла expr. Я экспериментировал с do.call, но безуспешно :(

Воображаемый пример работы (который действует как for цикл, но создает TkProgressBar и автоматически обновляет его в каждой итерации):

forp (i in 1:10) {
    #do something
}

UPDATE: Я думаю, что суть вопроса в том, как записать после функции функцию, которая не только имеет параметры в круглых скобках (например: foo(bar)), но также может обрабатывать expr, указанную после закрывающих круглых скобок, например:foo(bar): foo(bar) expr.


BOUNTY OFFER: перейдет к любому ответу, который может изменить мою предложенную функцию , чтобы она работала как синтаксис основных циклов для . Например, вместо

> forp(1:1000, {
+   a<-i
+ })
> a
[1] 1000

она могла бы быть вызвана как:

> forp(1:1000) {
+   a<-i
+ }
> a
[1] 1000

Просто для того, чтобы еще раз прояснить задачу: как мы можем захватить { выражение } часть вызова функции? Боюсь, что это невозможно, но на несколько дней уйдёт на вознаграждение за:)

19
задан Cotton.Rockwood 10 May 2019 в 20:56
поделиться