[R] Generalized 2D list/array/whatever?

David Winsemius dwinsemius at comcast.net
Fri Apr 24 06:16:10 CEST 2009


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:

> I must be going about my idea really backwards.  I have functions  
> like so:
>
> Nasa_PART_Bounds <- rbind(Nasa_PART_Bounds, c("Nasa_PART_B1"))
> Nasa_PART_B1 <- function(l,u) {
>        l[["Nasa_PART_B1", "CYCLOMATIC_COMPLEXITY"]] <- 8
>        u[["Nasa_PART_B1", "CYCLOMATIC_COMPLEXITY"]] <- 60
>        l[["Nasa_PART_B1", "LOC_TOTAL"]] <- 73
> }
>
> Where I add the function names of each "bounds" function to a list,
> which later on get called with two variables.
>
> dispatch2 <- function(f, x, y) {
>        eval(call(f, x, y))
> }
>
> for (i in bounds) {
>        bb <- eval(substitute(foo[,1], list(foo=as.name(i))))
>        rr <- lapply(bb, dispatch2, lb, ub)
> }
>
> However, I don't know how to do this in a better "R" way.  I think  
> my C and
> pearl experience is showing through... :(
>
> -Toby.
>
>
> On Thu, Apr 23, 2009 at 8:20 PM, Gabor Grothendieck <ggrothendieck at gmail.com
>> wrote:
>
>> 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'm trying to figure out how I can get a generalized 2D
>>> list/array/matrix/whatever
>>> working.  Seems I can't figure out how to make the variables the  
>>> right
>>> type.  I
>>> always seem to get some sort of error... out of bounds, wrong  
>>> type, wrong
>>> dim, etc.
>>> Very confused... :)
>>>
>>> x[["some label", "some other index"]] <- 3
>>> x[["some other label", "something else"]] <- 4
>>>
>>> I don't know the indexes/label ahead of time... they get  
>>> generated...
>> Any
>>> thoughts?

David Winsemius, MD
Heritage Laboratories
West Hartford, CT




More information about the R-help mailing list