Why is the class of a vector the class of the elements of the vector and not vector itself?

r

Solution

This is what I get from this. `class` is mainly meant for object oriented programming and there are other functions in R which will give you the storage mod of an object (see `?typeof` or `?mode`).

When looking at `?class`

Many R objects have a class attribute, a character vector giving the names of the classes from which the object inherits. If the object does not have a class attribute, it has an implicit class, "matrix", "array" or the result of mode(x)

It seems like `class` works as follows

It first looks for a `$class` attribute

If there isn't any, it checks if the object has a `matrix` or an `array` structure by checking the `$dim` attribute (which is not present in a `vector`)

2.1. if `$dim` contains two entries, it will call it a `matrix`

2.2. if `$dim` contains one entry or more than two entries, it will call it an `array`

2.3. if `$dim` is of length 0, it goes to the next step (`mode`)

- if `$dim` is of length 0 and there is no `$class` attribute, it performs `mode`

So per your example

mat <- matrix(rep("la", 3), ncol=1)
vec <- rep("la", 3)
attributes(vec)
# NULL
attributes(mat)
## $dim
## [1] 3 1

So you can see that `vec` doesn't contain any attributes whatsoever (see `?c` or `?as.vector` for explanation)

So in first case, `class` performs

attributes(vec)$class
# NULL
length(attributes(vec)$dim)
# 0
mode(vec)
## [1] "character"

In the second case it checks

attributes(mat)$class
# NULL
length(attributes(mat)$dim)
##[1] 2

It sees that the object has two dimensions and there for calls it `matrix`

In order to illustrate that both `vec` and `mat` have same storage mode, you can do

mode(vec)
## [1] "character"
mode(mat)
## [1] "character"

You can also see, for example, same behavior with an array

ar <- array(rep("la", 3), c(3, 1)) # two dimensional array
class(ar)
##[1] "matrix"
ar <- array(rep("la", 3), c(3, 1, 1)) # three dimensional array
class(ar)
##[1] "array"

So both `array` and `matrix` don't parse a `class` attribute. Let's check, for example, what `data.frame` does.

df <- data.frame(A = rep("la", 3))
class(df)
## [1] "data.frame"

Where did `class` took it from?

attributes(df)    
# $names
# [1] "A"
# 
# $row.names
# [1] 1 2 3
# 
# $class
# [1] "data.frame"

As you can see, `data.fram` sets a `$class` attribute, but this could be changed

attributes(df)$class <- NULL
class(df)
## [1] "list"

Why `list`? Because `data.frame` don't have a `$dim` attribute (neither a `$class` one, because we just deleted it), thus `class` performs `mode(df)`

mode(df)
## [1] "list"

Lastly, in order to illustrate how `class` works, we can manually set the `class` to whatever we want and see what it will give us back

mat <- structure(mat, class = "vector")
vec <- structure(vec, class = "vector")
class(mat)
## [1] "vector"
class(vec)
## [1] "vector"

Problem

I don't understand why the class of a vector is the class of the elements of the vector and not vector itself. ``` vector <- c("la", "la", "la") class(vector) ## [1] "character" matrix <- matrix(1:6, ncol=3, nrow=2) class(matrix) ## [1] "matrix" ```

Original source