Skip to content

Generalized 2D list/array/whatever?

8 messages · Gabor Grothendieck, Toby, David Winsemius +2 more

#
Matrix made from a list:

m <- list(sin, 1:3, letters[1:3], expression(a+b))
dim(m) <- c(2, 2)
dimnames(m) <- list(letters[1:2], LETTERS[1:2])
class(m) # matrix

or

M <- structure(list(sin, 1:3, letters[1:3], expression(a+b)), .Dim = c(2, 2),
  .Dimnames = list(c("a", "b"), c("A", "B")))
class(M) # matrix
On Thu, Apr 23, 2009 at 10:03 PM, Toby <tobias.weingartner at gmail.com> wrote:
#
I cannot figure out what you are trying to do, but I'm reasonably sure  
that the construction:

xxx[[index,index2]] ... is going to fail. If you want to create a two  
dimensional structure, most people would use either a dataframe or a  
matrix rather than a list, although lists have the advantage that they  
do not need to be "pre-dimensioned". If you know what your dimension  
are in advance they are probably the way to go.

If you want to access multiple "dimensions" of a list, do not use  
[[ , ]] but rather [[ idx ]] to get the desired first "dimension" and  
then [ idx2 ] to the right of the expression for the first "dimension"  
to get or change the second "dimension", although "level" or "depth"  
might be the better terminology.

m <- list(sin, 1:3, letters[1:3], expression(a+b))
m[[2]][3]  ]
m[[2]][3] <- 8
m
m[[2]][3]

You have a better chance of getting on target advice if you explain  
what you want to do rather than showing us code patterned on another  
language that obviously doesn't work in R.
On Apr 23, 2009, at 10:29 PM, Toby wrote:

            
David Winsemius, MD
Heritage Laboratories
West Hartford, CT
#
On Apr 24, 2009, at 12:16 AM, David Winsemius wrote:

            
# that "]" shouldn't be there
David Winsemius, MD
Heritage Laboratories
West Hartford, CT
#
Toby wrote:
What you have there is not legal syntax, but this would be:

x[[c("some label", "some other index")]] <- 3

This assumes that x is a list, and one of its entries is a list named 
"some label".  It will not create that entry, but it will create an 
entry named "some other index", so you need

if (is.null(x[["some label"]])) x[["some label"]] <- list()

first.  After executing this line and your first line above, you'll get

 > x
$`some label`
$`some label`$`some other index`
[1] 3

Duncan Murdoch
#
On Fri, Apr 24, 2009 at 5:50 AM, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
It isn't?

a <- as.list(1:4)
dim(a) <- c(2, 2)
rownames(a) <- c("a", "b")
colnames(a) <- c("c", "d")

a[["a", "d"]]

Hadley
#
On 24/04/2009 8:48 AM, hadley wickham wrote:
You're right, it is.  Sorry.

However, I think the solution I gave (not to make the list into an 
array, but rather to use a list of lists) is probably better in a lot of 
situations where the indices show up unpredictably.

Duncan Murdoch