Мне нравится использовать индикатор выполнения, пока работает медленно 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 с индикатором выполнения), чтобы вызывать так же, как for
но с автоматически добавленным индикатором выполнения - но, к сожалению, понятия не имею, как реализовать и захватить часть expr
функции цикла. У меня было несколько экспериментов с do.call
но безуспешно :(
Воображаемый рабочий пример (который действует как цикл for
но создает TkProgressBar
и автоматически обновляет его в каждой итерации):
forp (i in 1:10) {
#do something
}
ОБНОВЛЕНИЕ: Я думаю, что суть вопроса в том, как написать функцию, которая не только имеет параметры в скобках после функции (например: foo(bar)
), но также может обрабатывать expr
указанное после закрывающих скобок, например: foo(bar) expr
.
BOUNTY OFFER: пойдет на любой ответ, который может изменить мою предложенную функцию, чтобы она работала как синтаксис basic for
loop. Например, вместо
> forp(1:1000, {
+ a<-i
+ })
> a
[1] 1000
это можно назвать так:
> forp(1:1000) {
+ a<-i
+ }
> a
[1] 1000
Просто чтобы прояснить задачу: как мы можем получить часть { expression }
вызова функции? Боюсь, что это невозможно, но оставлю на награду несколько дней для профи :)