Thanks. That is clear. I need to seperate the concept of Array and Vector in my head. As soon as I hit sendon that last post I realised it is a bit silly to say vectors only contain atomic things.
W On Thu, Apr 19, 2012 at 12:35 PM, William Dunlap <wdun...@tibco.com> wrote: >> -----Original Message----- >> From: Worik R [mailto:wor...@gmail.com] >> Sent: Wednesday, April 18, 2012 5:05 PM >> To: William Dunlap >> Cc: r-help >> Subject: Re: [R] Can a matrix have 'list' as rows/columns? >> >> [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. > > It will be more fruitful in R to think of a vector as a thing that can > be subscripted by one subscript and a matrix as something that > can be subscripted by two. (This is not exactly how a matrix is defined, > but I find it is good way to think about them.) A matrix should definitely > not be thought of as "an ordered collection of vectors, all the same type > and length". It is just a vector with an attribute called "dims" that > lets you subscript with 2 indices. > > I have used a matrix(list(...),...) to conveniently contain remote > sensing observations binned by latitude and longitude. Each bin > may contain any number of observations. > >> 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 > > Note that as.vector just strips the attributes (except for the names) > from the input list. Bare lists are vectors. Hence V and L are identical. > >> 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 > > Compare this to an atomic vector - there is no difference in behavior: > > a <- 1 # a length 1 atomic vector > > a[2] <- numeric() > Error in a[2] <- numeric() : replacement has length zero > You cannot replace a 1-long part of a vector with a 0-long vector. > (If you could, I suppose it would be a no-op.) > > With a list you can do > V[[2]] <- list() > because V[[2]] refers to the 2nd element of the list, not the > sublist of length 1 that contains the 2nd element that V[2] > means. > > > Bill Dunlap > Spotfire, TIBCO Software > wdunlap tibco.com > > > > >> >> > 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 ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.