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

Bert Gunter gunter.berton at gene.com
Wed Apr 18 07:29:13 CEST 2012


Not sure this adds to, subtracts from, or obfuscates this thread, but ...

> x <- list(a=1:3,b = log, c=letters[2],d=as.list(1:5))

> is.vector(x)
[1] TRUE

> dim(x) <- c(2,2)

> is.matrix(x)
[1] TRUE

> is.vector(x)
[1] FALSE

> x
     [,1]      [,2]
[1,] Integer,3 "b"
[2,] ?         List,5

> x[2,1](5)
Error: attempt to apply non-function
## because...
> x[2,1]
[[1]]
function (x, base = exp(1))  .Primitive("log")
##   thus ...
> x[2,1][[1]](5)
[1] 1.609438
##  as well as
> x[[2]](5)
[1] 1.609438

## because it's still the case that ...
> is.list(x)
[1] TRUE  ## it's a list with "dim" attribute and thus...
> class(x)
[1] "matrix"

## But it's not a vector:
> is.vector(x)
[1] FALSE

I'm not sure all this is consistent, but I think a full understanding
of the semantics probably requires poking into more musty corners of R
than I can handle, anyway.

Cheers,
Bert

On Tue, Apr 17, 2012 at 5:15 PM, David Winsemius <dwinsemius at comcast.net> wrote:
>
> On Apr 17, 2012, at 7:27 PM, Worik R wrote:
>
>> On Tue, Apr 17, 2012 at 11:52 PM, David Winsemius
>> <dwinsemius at comcast.net>wrote:
>>
>>>
>>> On Apr 17, 2012, at 12:13 AM, Worik R wrote:
>>>
>>> After a lot of processing I get a matrix into M.  I expected each row and
>>>>
>>>> column to be a vector.  But it is a list.
>>>>
>>>
>>> This behavior is not the result of limitation in how R's sapply might
>>> have
>>> processed a purely numeric set of results, but is because you (probably)
>>> returned a hetergeneous set of classes rom you inner function. Assuming
>>> that "last" is actually function(x){tail,1}, then the structure of M is
>>>
>>> str(M)
>>> List of 6
>>> [snip]
>>> ..$ : chr [1:3] "aaa" "bbb" "ccc"
>>>
>>> Had the result been a more homogeneous collection, I sapply would have
>>> returned an array of atomic numeric vectors. Try just returning a number:
>>>
>>>> M2 <- sapply(Qm, function(nm, DF){last(DF[DF[, "Name"]==nm,"Value"])},
>>>
>>> DF)
>>>
>>
>> Yes that returns a vector.  I want a matrix.
>>
>> I see that my problem is that the columns of DF are not all the same type.
>> Once I did that (made Value character) I get my matrix just as I need.  SO
>> it was I passed *in* that was the problem  Not what I did with it inside
>> 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?
>
>
> No. It is by design. "list" is an acceptable storage mode for vector().
>
>> It must be bad design?
>
>
> That is (obviously) a matter of opinion. R is in the middle region between
> LiSP and a strongly typed language.
>
>>
>> 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.
>
>
> I keep getting surprises as well. I did experience surprise at the point I
> saw that is.vector() returning TRUE for a list. I think that means that
> is.vector is rather less informative than I expected. Essentially only
> language objects fail:
>
>> z <- as.formula("x ~ y")
>> z
> x ~ y
>> is.vector(z)
> [1] FALSE
>
>
> Even expressions are vectors:
>
>> z <- expression( x ~ y)
>> z
> expression(x ~ y)
>> is.vector(z)
> [1] TRUE
>
>
>>  But it may
>> be my mind that is at fault!  What are other people's experience?*
>
>
> I still have not fully wrapped my head around the higher levels of the
> language. I thought reading Chamber's book would help, but it had too much
> prose and did not present enough worked examples to sync with my learning
> style. I'm still looking for a book that lets me use the language more
> effectively.
>
> --
> David.
>
>>
>> Worik
>>
>>
>>>> class(M)
>>>
>>> [1] "numeric"
>>>>
>>>> str(M2)
>>>
>>> Named num [1:3] 0.6184 0.0446 0.3605
>>> - attr(*, "names")= chr [1:3] "aaa" "bbb" "ccc"
>>>
>>> --
>>> David.
>>>
>>>>
>>>> R-Inferno says...
>>>>
>>>> "Arrays (including matrices) can be subscripted with a matrix of
>>>> positive
>>>> numbers. The subscripting matrix has as many columns as there are
>>>> dimensions
>>>> in the array—so two columns for a matrix. The result is a vector (not an
>>>> array)
>>>> containing the selected items."
>>>>
>>>> My version of R:
>>>> version.string R version 2.12.1 (2010-12-16)
>>>>
>>>> Here is an example...
>>>>
>>>> Qm <- c("aaa", "bbb", "ccc")
>>>>>
>>>>> DF <- data.frame(Name=sample(Qm, replace=TRUE, size=22),
>>>>> Value=runif(22),
>>>>>
>>>> stringsAsFactors=FALSE)
>>>>
>>>>> M <- sapply(Qm, function(nm, DF){last(DF[DF[, "Name"]==nm,])}, DF)
>>>>> class(M)
>>>>>
>>>> [1] "matrix"
>>>>
>>>>> class(M[,1])
>>>>>
>>>> [1] "list"
>>>>
>>>>> class(M[1,])
>>>>>
>>>> [1] "list"
>>>>
>>>>> M
>>>>>
>>>>   aaa       bbb      ccc
>>>> Name  "aaa"     "bbb"    "ccc"
>>>> Value 0.4702648 0.274498 0.5529691
>>>>
>>>>> DF
>>>>>
>>>> Name      Value
>>>> 1   ccc 0.99948920
>>>> 2   aaa 0.51921281
>>>> 3   aaa 0.10803943
>>>> 4   aaa 0.82265847
>>>> 5   ccc 0.83237260
>>>> 6   bbb 0.88250933
>>>> 7   aaa 0.41836131
>>>> 8   aaa 0.66197290
>>>> 9   ccc 0.01911771
>>>> 10  ccc 0.99994699
>>>> 11  bbb 0.35719884
>>>> 12  ccc 0.86274858
>>>> 13  bbb 0.57528579
>>>> 14  aaa 0.12452158
>>>> 15  aaa 0.44167731
>>>> 16  aaa 0.11660019
>>>> 17  ccc 0.55296911
>>>> 18  aaa 0.12796890
>>>> 19  bbb 0.44595741
>>>> 20  bbb 0.93024768
>>>> 21  aaa 0.47026475
>>>> 22  bbb 0.27449801
>>>>
>>>>>
>>>>>
>
> David Winsemius, MD
> West Hartford, CT
>
> ______________________________________________
> R-help at 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.



-- 

Bert Gunter
Genentech Nonclinical Biostatistics

Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm



More information about the R-help mailing list