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" ```