Мне нравится использовать индикатор прогресса при медленном выполнении циклов для
. Это легко сделать с помощью нескольких помощников, но мне нравится 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
Просто для того, чтобы еще раз прояснить задачу: как мы можем захватить { выражение }
часть вызова функции? Боюсь, что это невозможно, но на несколько дней уйдёт на вознаграждение за:)