[R] Can a matrix have 'list' as rows/columns?

Worik R worikr at gmail.com
Thu Apr 19 02:05:01 CEST 2012


[snip]
>
> sapply.  In this case I would expect M to be a list.  I am gobsmacked that
> > a list can be considered a vector.    Is that a bug?  It must be bad design?
> >
> > I have been using R for a number of years (5?) and heavilly for two years.
> > I am still getting bitten by these "features" in R.  To my mind there are
> > many places that R violates the *principle of least surprise.  But it may
> > be my mind that is at fault!  What are other people's experience?*
>
> Since a matrix may contain logical, integer, numeric (double precision),
> complex, and character data, I would be surprised if it didn't also handle
> list data.  I am surprised that a matrix cannot contain factor data.


logical, integer, double, complex and character are all atomic.
Usually, where I have been (have I been in the wrong places?) a vector
is a one dimensional ordered collection of homogeneously typed atomic
things.  A matrix an ordered  collection of  vectors, all the same
type and length.

A list is R's hold all type.  It has a count of things in it, but each
thing is an arbitrary thing in itself.  It could be another list, or
whatever.  Elsewhere on this thread there are some helpful examples of
how lists must be changed to be forced into a matrix or to be a
vector.

That is the violation of  the "Least Astonishment Principle".

Here is an example I just made up...

> L <- list()
> L[[1]] <- list()
> L[[1]][[1]] <- TRUE
> L[[1]][["ABC"]] <- pi
> L
[[1]]
[[1]][[1]]
[1] TRUE

[[1]]$ABC
[1] 3.141593


> V <- as.vector(L)
> V
[[1]]
[[1]][[1]]
[1] TRUE

[[1]]$ABC
[1] 3.141593


 M <- matrix(L, ncol=2, nrow=3)
 M
     [,1]   [,2]
[1,] List,2 List,2
[2,] List,2 List,2
[3,] List,2 List,2

> V[2] <- list()
Error in V[2] <- list() : replacement has length zero

> L2 <- list()
> L2[[1]] <- "asd"
> V[2] <- L2
> class(V)
[1] "list"

> V2 <- as.vector(V)
> length(V2)
[1] 2
> V2[1]
[[1]]
[[1]][[1]]
[1] TRUE

[[1]]$ABC
[1] 3.141593


> V2[2]
[[1]]
[1] "asd"


That is astonishing to me!  I had no way to predict what would happen.
 5 days ago I would have expected the statement "as.vector(L)" to
produce an error.  "V[2] <- list()" did.

cheers
Worik



More information about the R-help mailing list