# [R] Data.frame Vs Matrix Vs Array: Definitions Please

Gabor Grothendieck ggrothendieck at gmail.com
Wed Oct 27 15:45:20 CEST 2010

```On Wed, Oct 27, 2010 at 8:38 AM, Ivan Calandra
<ivan.calandra at uni-hamburg.de> wrote:
> What I don't understand is why vectors (with more than one value) don't have
> dimensions. They look like they do have 1 dimension. For me no dimension
> would be a scalar. Like in geometry: a point has no dimension, a line has 1,
> a square has 2, a cube 3 and so on. Is it because of some internal process?
> The intuitive geometry way of thinking is not programmatically relevant?
>

Maybe you used APL before.   The basic structure in that language is
an array but that is not the case for R. The basic structure for data
is a vector and more complex data objects are build from that.  An
array is a more complex object than a vector.  A 1d array is not the
same as a vector.  Dimensions are an additional concept unlike APL.

>
>>> I would also add these:
>>> - the components of a vector have to be of the same mode (character,
>>> numeric, integer...)
>>
>> however, a list with no attributes is a vector too so this is a vector:
>>
>>    >   vl<- list(sin, 3, "a")
>>    >   is.vector(vl)
>>    [1] TRUE
>>
>> A vector may not have attributes so arrays and factors are not vectors
>> although they are composed from vectors.
>
> That's also completely unexpected for me! What is then a vector?! And then
> the difference between a vector and a list?! I mean, in practice, it's not
> so important, my understanding is probably enough for what I'm doing in R,
> but I'd like to understand how it works.

A list is really a vector of pointers so the components are of the
same type.  Its just that you can't access the pointer nature of the
components.  For example, you can have a matrix based on a list.  We
have added a dimension to the list so it becomes an array even though
its based on a list:

> m <- matrix(list(sin, "a", 1, list(1:3)), 2, 2)
> dput(m)
structure(list(.Primitive("sin"), "a", 1, list(1:3)), .Dim = c(2L,
2L))
> m
[,1] [,2]
[1,] ?    1
[2,] "a"  List,1
> is.array(m)
[1] TRUE
> class(m)
[1] "matrix"

>
> Also you wrote that a vector may not have attributes. I might be wrong (and
> certainly am), but aren't names attributes? So with is a named list still a
> vector:
> my.list <- list(num=1:3, let=LETTERS[1:2])
> names(my.list)
> [1] "num" "let"
> is.vector(my.list)
> [1] TRUE

names don't count. Neither does class.

--
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com

```