[Rd] write.table inconsistency (PR#7403)

maechler at stat.math.ethz.ch maechler at stat.math.ethz.ch
Sat Dec 4 13:52:06 CET 2004

>>>>> "Duncan" == Duncan Murdoch <murdoch at stats.uwo.ca>
>>>>>     on Sat,  4 Dec 2004 01:55:26 +0100 (CET) writes:

    Duncan> There's an as.matrix() call in write.table that means the formatting
    Duncan> of numeric columns changes depending on whether there are any
    Duncan> non-numeric columns in the table or not.  

yes, I think I had seen this (a while ago in the source code)
and then wondered if one shouldn't have used
   data.matrix()  instead of  as.matrix()   
- something I actually do advocate more generally, as "good
programming style".  It also does solve the problem in the
example here -- HOWEVER, the lines *before* as.matrix() have

    ## as.matrix might turn integer or numeric columns into a complex matrix
    cmplx <- sapply(x, is.complex)
    if(any(cmplx) && !all(cmplx)) x[cmplx] <- lapply(x[cmplx], as.character)
    x <- as.matrix(x)

which makes you see that  write.table(.) should also work when
the data frame has complex variables {or some other kinds of
non-numeric as you've said above} -- something which
data.matrix() can't handle....
As soon as you have a complex or a character variable (together
with others) in your data.frame,  as.matrix() will have to
return "character" and apply format() to the numeric variables, as well...

So, to make this consistent in your sense, i.e. formatting of a
column shouldn't depend on the presence of other columns, we
can't use as.matrix() nor data.matrix() but have to basically
replicate an altered version of as.matrix inside write.table.

I propose to do this, but expose the altered version as
something like

and replace the 4 lines {of code in write.table()} above by the
single line



More information about the R-devel mailing list