Attribute
Bei der sehr umständlichen Erstellung des Datensatzes haben wir schon die attributes
kennen gelernt. Diese Informationen, die in R zu einem Objekt neben dem eigentlichen Inhalt angelegt werden können, sind ein wichtiger Teil der Abbildung objektorientierter Programmierparadigmen4 in R.
<- list(1:10,1:10)
a attributes(a)
## NULL
attributes(a) <- list(names = letters[1:2],
row.names = 1:10,
class = "data.frame")
a
## a b
## 1 1 1
## 2 2 2
## 3 3 3
## 4 4 4
## 5 5 5
## 6 6 6
## 7 7 7
## 8 8 8
## 9 9 9
## 10 10 10
Neben der Klasse (class
) haben wir hier in die attributes
auch die Namen der Einträge und die Zeilennamen geschrieben. Wir sehen also, dass der sichtbare und bemerkbare Unterschied zwischen Listen und Datensätzen aus dem Setzen dieser Attribute entsteht. Außerdem wird an diesem Beispiel deutlich, dass die Funktionen, die wir bisher zum Erstellen von Datensätzen genutzt haben, auch eigentlich nur Attribute setzen.
Attribute sind also zusätzliche Informationen, die den Umgang mit Objekten ändern können.
Ein weiteres Beispiel für solche Änderungen durch Attribute sind Matritzen. In R kann man mit der matrix
-Funktion zweidimensionale Daten-Raster erstellen, für die zum Beispiel auch die dimensionierte Indizierung [,]
definiert ist:
matrix(1:100,
nrow = 10,
ncol = 10)
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 11 21 31 41 51 61 71 81 91
## [2,] 2 12 22 32 42 52 62 72 82 92
## [3,] 3 13 23 33 43 53 63 73 83 93
## [4,] 4 14 24 34 44 54 64 74 84 94
## [5,] 5 15 25 35 45 55 65 75 85 95
## [6,] 6 16 26 36 46 56 66 76 86 96
## [7,] 7 17 27 37 47 57 67 77 87 97
## [8,] 8 18 28 38 48 58 68 78 88 98
## [9,] 9 19 29 39 49 59 69 79 89 99
## [10,] 10 20 30 40 50 60 70 80 90 100
Aufgabe
Erstelle eine Matrix und gucke die genau die Attribute und Inhalte an.
Können wir so wie wir einen Datensatz aus einer Liste erstellt haben, irgendwie ohne die matrix
-Funktion eine Matrix erstellen? Gucke Dir dabei nach jeder Änderung an, was class
und mode
zurückgeben.
Probiere außerdem aus, was passiert, wenn man die Attribute einer Matrix auf eine Liste überträgt.
Zusatz:
Was passiert, wenn wir der Liste drei Dimensionen geben?
Antwort
<- matrix(letters[1:20],
my_mat 4)
attributes(my_mat)
## $dim
## [1] 4 5
mode(my_mat)
## [1] "character"
class(my_mat)
## [1] "matrix" "array"
<- list(1:5,6:10,11:15,16:20)
my_list_mat
attributes(my_list_mat) <- list(dim = c(2,2))
my_list_mat
## [,1] [,2]
## [1,] integer,5 integer,5
## [2,] integer,5 integer,5
mode(my_list_mat)
## [1] "list"
class(my_list_mat)
## [1] "matrix" "array"
## Zusatz
<- list(1, 2,
my_list_mat 3, 4,
5, 6,
7, 8)
attributes(my_list_mat) <- list(dim = c(2,4))
my_list_mat
## [,1] [,2] [,3] [,4]
## [1,] 1 3 5 7
## [2,] 2 4 6 8
mode(my_list_mat)
## [1] "list"
class(my_list_mat)
## [1] "matrix" "array"
attributes(my_list_mat) <- list(dim = c(2,2,2))
my_list_mat
## , , 1
##
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## , , 2
##
## [,1] [,2]
## [1,] 5 7
## [2,] 6 8
mode(my_list_mat)
## [1] "list"
class(my_list_mat)
## [1] "array"
Mit anderen Worten ist eine Matrix als ein Array definiert, das (egal ob Liste oder Vektor), zwei Dimensionen hat. Mit mehr als zwei Dimensionen fällt die Matrix-Klasse weg.
Die Matrix-Listen aus der Aufgabe können wir übrigens auch wie Matrizen verwenden:
attributes(my_list_mat) <- list(dim = c(2,4))
t(my_list_mat)
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
## [4,] 7 8
1,2] my_list_mat[
## [[1]]
## [1] 3
Das Ergebnis ist halt nur eine Liste, was mit dem bekannten doppel-Index aber auch umgangen werden kann:
1,2]] my_list_mat[[
## [1] 3
Literatur
Was genau objektorientierte Programmierung ist, ist hier erstmal nicht so wichtig, im Prinzip sind aber alle Objekte mit
class
-Attribut nach objektorientierten Paradigmen erstellt. Hier wird das nur erwähnt, weil es die Geschichte von R als Nachfolger von S demonstriert, in dem ursprünglich “moderne” Paradigmen nicht Thema waren. Die Erweiterung der bestehenden Objekte durch das Setzen von Attributen ist die Lösung für dieses Problem, die in RsS3
-Objekten resultieren. Daneben gibt es in R dieS4
-Objekte, die formalisiertere Klassendefinitionen ermöglichen. Das führt aber alles ein bisschen weit für diese Veranstaltung, deswegen sei hier nochmal auf das sehr gute Buch von Wickham (2019) verwiesen, in den Kapiteln 13-15 geht er auf OO-Programmierung in R ein.↩︎