Skip to content

matrix coercion, logical -> character

5 messages · Peter Dalgaard, Patrick Burns, Brian Ripley

#
Anyone know whether this is intentional, and by which rationale?
(R-devel on RedHat, but hardly new)
Error in FUN(newX[, i], ...) : argument to "which" is not logical
$a
[1] "logical"

$b
[1] "logical"
[1] "character"
#
On 8 Dec 2003, Peter Dalgaard wrote:

            
It is documented:

     'as.matrix' is a generic function. The method for data frames will
     convert any non-numeric column into a character vector using
     'format' and so return a character matrix.

Remember than not some long ago you could not have logical columns in data 
frames: they were coerced to factors.

It would be easy to change to allow numeric, logical or character 
matrices.

  
    
#
Prof Brian Ripley <ripley@stats.ox.ac.uk> writes:
and for apply:

     If 'X' is not an array but has a dimension attribute, 'apply'
     attempts to coerce it to an array via 'as.matrix' if it is
     two-dimensional (e.g., data frames) or via 'as.array'.

explains why apply(...., which) got in trouble
Yes. That was the direction in which I was hinting. It does seem a bit
like a leftover, and applying which() over a set of logical
columns is not unlikely to be useful in practice.
#
It seems another reason to make the change would be the
ability to work around the following feature:

 > lmat <- as.matrix(data.frame(a=c(FALSE, TRUE)))
 > lmat
  a     
1 "FALSE"
2 " TRUE"
 > mode(lmat) <- "logical"
 >
 > lmat
      a
1 FALSE
2    NA

Numeric, character and logical were mentioned.  Complex data
frames coerce to complex matrices already.

Apropos of this, it would be good to put a See Also "complex"
in the "numeric" help file and vice versa.

Patrick Burns

Burns Statistics
patrick@burns-stat.com
+44 (0)20 8525 0696
http://www.burns-stat.com
(home of S Poetry and "A Guide for the Unwilling S User")
Peter Dalgaard wrote:

            
#
On Mon, 8 Dec 2003, Patrick Burns wrote:

            
(Yes, complex is numeric for this purpose.  I had checked that out.)