From phgrosjean at sciviews.org  Sat Dec 29 13:44:04 2007
From: phgrosjean at sciviews.org (Philippe Grosjean)
Date: Sat, 29 Dec 2007 13:44:04 +0100
Subject: [Rd] (PR#10534 capture.output(),
 truncated last output without \n
In-Reply-To: <Pine.LNX.4.64.0712291151440.21325@gannet.stats.ox.ac.uk>
References: <20071229111526.1015E2834619@mail.pubhealth.ku.dk>
	<Pine.LNX.4.64.0712291151440.21325@gannet.stats.ox.ac.uk>
Message-ID: <47764114.7090400@sciviews.org>

Thank you, Brian.

Prof Brian Ripley wrote:
> This only happens if 'file' is a text connection, and is the expected 
> behaviour in that case: you cannot capture an incomplete line to a text 
> connection.

Well, in ?textConnection, Details section, one can read:
"Closing the connection will output the final line, complete or not."

> There seems no reason to break the documented behaviour in other cases 
> to change something that you consider to a bug when file=NULL and the 
> user does not produce complete output.  It would be possible to make use 
> of isIncomplete() to add a final newline only where needed to complete a 
> line.  E.g. use
> 
>     if(inherits(file, "textConnection") && isIncomplete(file)) cat("\n")

This is fine, except one cannot detect when the last line was complete 
or not in capture.output(). I suggest adding an attribute complete = 
TRUE/FALSE to the result returned by capture.output(), or any other mean 
to return this information.

Best,

Philippe Grosjean

> 
> On Sat, 29 Dec 2007, phgrosjean at sciviews.org wrote:
> 
>> Full_Name: Philippe Grosjean
>> Version: 2.6.1
>> OS: MacOS X; Windows XP
>> Submission from: (NULL) (81.243.237.235)
>>
>>
>> Last output from capture.output() is truncated if it does not end with a
>> carriage return:
>>
>>> capture.output(cat("text\n"))  # Fine
>> [1] "text"
>>> capture.output(cat("text"))    # Missing output!
>> character(0)
>>> capture.output({cat("text");1+1})  # Only last output is affected
>> [1] "text[1] 2"
>>
>> Proposed patch: add a carriage return before exiting capture.output():
>>
>> capture.output <-
>> function (..., file = NULL, append = FALSE) {
>>
>>
>> [...]
>>
>>        for (item in tmp) if (item$visible)
>>            print(item$value)
>>    }
>>    cat("\n")  ### ADD THIS!
>>    rval
>> }
>>
>> This changes the behavior of capture.output() a little bit, since it 
>> adds "" at
>> the end of regular outputs, but it solves the problem and it allows to 
>> detect if
>> last output line was ended by \n, or not.
>>
>> Regards,
>>
>> Philippe Grosjean
>>               _
>> platform       i386-apple-darwin8.10.1
>> arch           i386
>> os             darwin8.10.1
>> system         i386, darwin8.10.1
>> status
>> major          2
>> minor          6.1
>> year           2007
>> month          11
>> day            26
>> svn rev        43537
>> language       R
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>



[Rd] (PR#10534 capture.output(), truncated last output without \n
Philippe Grosjean