From tplate at acm.org  Mon Jul 31 17:52:10 2006
From: tplate at acm.org (tplate at acm.org)
Date: Mon, 31 Jul 2006 17:52:10 +0200 (CEST)
Subject: [Rd] bug in format.default: trim=TRUE does not always work as
	advertised (PR#9114)
Message-ID: <20060731155210.DF025281EF@slim.kubism.ku.dk>

This is a multi-part message in MIME format.
--------------090008060607010208040805
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

DESCRIPTION OF PROBLEM:

Output from format.default sometimes has whitespace around it when using
big.mark="," and trim=TRUE.  E.g.:

  > # works ok as long as big.mark is not actually used:
  > format(c(-1,1,10,999), big.mark=",", trim=TRUE)
[1] "-1"  "1"   "10"  "999"
  > # but if big.mark is used, output is justified and not trimmed:
  > format(c(-1,1,10,999,1e6), big.mark=",", trim=TRUE)
[1] "       -1" "        1" "       10" "      999" "1,000,000"
  >

The documentation for the argument 'trim' to format.default() states:
     trim: logical; if 'FALSE', logical, numeric and complex values are
           right-justified to a common width: if 'TRUE' the leading
           blanks for justification are suppressed.

Thus, the above behavior of including blanks for justification when 
trim=FALSE (in some situations) seems to contradict the documentation.

PROPOSED FIX:

The last call to prettyNum() in format.default() 
(src/library/base/R/format.R) has the argument

    preserve.width = "common"

If this is changed to

    preserve.width = if (trim) "individual" else "common"

then output is formatted correctly in the case above.

A patch for this one line is attached to this message (patch done 
against the released R-2.3.1 source tarball (2006/06/01), the format.R 
file in this release is not different to the one in the current snapshot 
of the devel version of R).  After making these changes, I ran "make 
check-all".  I did not see any tests that seemed to  break with these 
changes.

-- Tony Plate


--------------090008060607010208040805
Content-Type: text/plain;
 name="format.default.fixes.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="format.default.fixes.diff"

--- R-2.3.1-orig/src/library/base/R/format.R	2006-04-09 16:19:19.000000000 -0600
+++ R-2.3.1/src/library/base/R/format.R	2006-07-26 15:52:42.117456700 -0600
@@ -37,7 +37,7 @@
 			 small.interval = small.interval,
 			 decimal.mark = decimal.mark,
 			 zero.print = zero.print,
-			 preserve.width = "common")
+                         preserve.width = if (trim) "individual" else "common")
 	       )
     }
 }

--------------090008060607010208040805--



[Rd] bug in format.default: trim=TRUE does not always work as advertised (PR#9114)
tplate at acm.org