phgrosjean at sciviews.org
2007-Dec-29 11:15 UTC
[Rd] capture.output(), truncated last output without \n (PR#10534)
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
Philippe Grosjean
2007-Dec-29 12:44 UTC
[Rd] (PR#10534 capture.output(), truncated last output without \n
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 >> >