Klasa S4 jest tworzona za pomocą funkcji setClass(). Jako minimum należy podać nazwę Class i jej atrybuty, formalnie znane jako gniazda w S4. Gniazda są określane w funkcji representation(), a fajną cechą jest to, że określasz typ oczekiwany dla takich atrybutów. To trochę pomaga przy sprawdzaniu typu. Istnieją inne wbudowane funkcje, których nie zamierzamy tutaj przeglądać. Na przykład możesz udostępnić funkcję, która sprawdza, czy obiekt jest spójny (nie został zmieniony w nieoczekiwany sposób). Możesz także określić wartości domyślne w parametrze o nazwie protoype. Jeśli chcesz te funkcje w S3, możesz również zaimplementować je samodzielnie, ale nie są one wbudowane. S4 jest uważany za potężny model obiektowy i zdecydowanie powinieneś zbadać go dokładniej, przeglądając jego dokumentację. Cały kod związany z S4 jest przechowywany w pakiecie metod. Ten pakiet jest zawsze dostępny, gdy uruchamiasz R interaktywnie, ale może być niedostępny, gdy uruchamiasz R w trybie wsadowym. Z tego powodu dobrym pomysłem jest dołączenie jawnego wywołania library(methods) za każdym razem, gdy używasz S4. Jak widać, koncepcyjna różnica w stosunku do klas S3 polega na tym, że tutaj faktycznie określamy typ obiektu dla każdego gniazda. Inne zmiany są bardziej syntaktyczne niż koncepcyjne. Zauważ, że możesz użyć nazwy innej klasy S4 dla jednego z gniazd, tak jak robimy w przypadku color dla S4Rectnagle. Oto jak możesz osiągnąć kompozycję za pomocą S4:
library(methods)
setClass(
Class = „S4olor”
representation = representation(
color = „charater”
)
)
setClass(
Class = „S4Rectangle”,
representation = representation(
a = „numeric”
b = „numeric”,
color = „S4Color’
)
)
Konstruktor jest tworzony automatycznie przez wywołanie funkcji nw(). Jeśli możesz zobaczyć, po prostu musisz przejść przez nazwę klasy, której instancję tworzysz, oraz wartości, które należy przypisać do slotów:
S4_rectangle <- new(
„S4Rectangle”,
a =2,
b = 3,
color = new(„S4Color, color = „blue”
)
class(S4_rectnagle)
#> [1] “S4Rectangle”
#> attr (, “package”)
#> [1] “.GlobalEnv”
str(S4_rectangle)
#> Klasa formalna „S4Rectangle” [pakiet „.GlobalEnv”] z 3 gniazdami
#> .. @ a: num 2
#> .. @ b: num 3
#> .. @ color: Klasa formalna „S4Color” [pakiet „.GlobalEnv”] z 1 gniazdem
#> .. .. .. @ color: chr “niebieski”
Tak jak poprzednio, pobieramy klasę obiektu i drukujemy ją. Kiedy go drukujemy, widzimy strukturę, która zawiera kilka symboli @. Są to operatory używane do uzyskiwania dostępu do gniazd (zamiast operatora $ dla S3). Możesz również zobaczyć zagnieżdżony slot dla atrybutu color klasy Color:
Niektóre nazwy slotów są zabronione, ponieważ są to zarezerwowane słowa kluczowe w R. Nazwy zabronione to class,comment, dim, dimnames, names,row.names i tsp.