[R] cat(), Rgui, and support for carriage return \r...

Duncan Murdoch murdoch at stats.uwo.ca
Sat Mar 18 20:39:16 CET 2006


On 3/17/2006 9:44 AM, Jeffrey Racine wrote:
> Hi, and thanks in advance for your time.
> 
> Background - I am working on a package and wish to have a routine's
> progress reported. The routine can take some time, and I would like to
> inform the user about the routine's progress. I have scoured the
> archives but to no avail, so would like to solicit input from this list.
> 
> I am successfully using
> 
> cat("\rBootstrap replication ", i, " of ", boot.num,)
> flush.console() # To flush stdout on windows systems
> 
> which works as expected on *NIX systems and using Rterm under windows.
> However, under Rgui the carriage return \r is ignored, and I certainly
> don't want to use the newline escape sequence \n. Under Rgui it appears
> as
> 
> Bootstrap replication 1 of 399Bootstrap replication 2 of 399Bootstrap...
> 
> but I want it to function properly if at all possible.
> 
> My question is simply whether there is a portable way to implement this
> so that it works regardless of the R platform the user may be working
> on?
> 
> Many thanks for any/all suggestions.

I've just been looking at the source code for this.  I think it will be 
relatively easy to make \r in Rgui do a destructive CR (i.e. it will 
return to the start of the line, but clear any existing characters). 
I'll play around a bit and then do that for R-devel.

In the meantime, \b does a destructive backspace, so you can get the 
effect you want with something like this:

msg <- ""
for (i in 1:1000) {
    cat(rep("\b", nchar(msg)), sep="")
    msg <- paste("Message ", i)
    cat(msg)
    flush.console()
}

This seems to work in Rgui, Rterm, (and R on Unix, if you get rid of the 
flush.console call).

Duncan Murdoch




More information about the R-help mailing list