Skip to content

Feature request: txtProgressBar with ability to write to arbitrary stream

5 messages · Matt Shotwell, Duncan Murdoch, Greg Snow +1 more

#
Hi all,

I use txtProgressBar to monitor progress of large computations. What I 
miss is the ability to redirect the progress bar to a stream other than 
stdout, specifically to the message stream. This would be useful for 
running Sweave scripts: When redirected to stderr, the bar could be 
visible even though console output is diverted to the output file (and 
there would be no cluttering of the generated latex).

I'd suggest the following changes to txtProgressBar:
- a new argument 'file' (compare to 'cat') which defaults to stderr() 
(there might be reasons to use stdout(), but I believe a progress bar is 
mostly intended as a diagnostic tool and not for console output, which 
is printed or saved in some cases).
- the calls to 'cat' that update the progress bar get 'file = file' as 
additional argument so that output is redirected as desired.

In case anyone from the core team is willing to incorparate this idea, I 
attached the patch file for the necessary changes below.

Best regards,

Andreas

3c3
<              width = NA, title, label, style = 1)
---
 >              width = NA, title, label, style = 1, file=stderr())
23c23
<             cat(paste(rep.int(char, nb-.nb), collapse=""))
---
 >             cat(paste(rep.int(char, nb-.nb), collapse=""), file = file)
27c27
<                 "\r", paste(rep.int(char, nb), collapse=""), sep = "")
---
 >                 "\r", paste(rep.int(char, nb), collapse=""), sep = 
"", file = file)
38c38
<             cat("\r", paste(rep.int(char, nb), collapse=""), sep = "")
---
 >             cat("\r", paste(rep.int(char, nb), collapse=""), sep = 
"", file = file)
42c42
<                 "\r", paste(rep.int(char, nb), collapse=""), sep = "")
---
 >                 "\r", paste(rep.int(char, nb), collapse=""), sep = 
"", file = file)
54c54
<         cat(paste(c("\r  |", rep.int(" ", nw*width+6)), collapse=""))
---
 >         cat(paste(c("\r  |", rep.int(" ", nw*width+6)), collapse=""), 
file = file)
59c59
<                     ), collapse=""))
---
 >                     ), collapse=""), file = file)
68c68
<             cat("\n")
---
 >             cat("\n", file = file)
#
Here's a temporary fix; reassign 'cat' in the environment of 
'txtProgressBar':

tpbEnv <- new.env()
assign("cat", function(...) cat(file=stderr(),...), tpbEnv)
environment(txtProgressBar) <- tpbEnv

Best,
Matt
On 03/15/2011 05:37 AM, Andreas Borg wrote:

  
    
#
On 15/03/2011 8:46 AM, Matt Shotwell wrote:
I would suggest renaming the function as well.  What's done above 
creates a new function called txtProgressBar, it doesn't modify the 
original one, so depending on scoping issues it may appear to only work 
sometimes.  But if you did

stderrProgressBar <- txtProgressBar
environment(stderrProgressBar) <- tpbEnv

you'll get clear messages if it is out of scope when you try to use it.

Duncan Murdoch
#
You could use winProgressBar (windows only) or TkProgressBar (tcltk package required) instead, then nothing is output to the console/standard out but you still have a visual of your progress.
#
Thanks for all the suggestions. However, I was not really looking for a 
solution but I want to propose this (in my view useful) change to be 
included in a future version of R. For the time being I will include a 
modified version in my package.

Best regards,

Andreas