84 pazuRrry
'P
Klasa może zawierać również funkcje. Szczególnie przydatne jest określenie funkr 'V cji initializeO, która wywoływana jest przy inicjacji nowego obiektu klasy. Pó niżej przykład definicji funkcji, pilnującej by wiek przyjmował rozsądne wartości.
setMethodCinitialize", "osoba”,
functionC.Object, imię « characterCNieznane") , wiek = numeric(O)) if (nargs() > 1) {
if(wiek > 120 II wiek < 0)
stop("Niedopuszczalna wartość dla slotu wiek") .Objectaimie <- imię .Objectawiek <- wiek
>
.Object
»
Sprawdźmy teraz, czy to zadziała.
> obiektOsoba <- newCosoba", imię3-"Przemek", wiek=2700)
Error in .lęcal(.Object, ...) : Niedopuszczalna wartość dla slotu wiek
m
Klasy można łączyć w zbiory klas. Obiektem takiego zbioru może być obiekt ,4-dowolnej z klas składowych. Jest to wygodny mechanizm, gdy chcemy, aby np. slot. mógł przyjmować wartości różnych typów. Zbiory klas można tworzyć funk
cją setClassUnion(methods). Zdefiniujmy taki przykładowy zbiór przechowujący
t ■ y s®
liczby lub łańcuchy znaków.
> setClassUnion("liczbaNapis", cCnumeric", "character"))
Możemy teraz zmodyfikować deklaracje klasy osoba, tak by dopuścić podawanie wieku nie tylko liczbowo, ale też opisowo.
> setClass("08oba2", representation(imie”"character”, wiek“"liczbaNapis“>)
> tt nie będzie sygnalizowany błąd, Wiek może być liczbą lab napisem
> obiektdsoba2 <- new(”osoba2", imie”"Przemek“, wiek="dorosły“)
Wybrane funkcje do operowania na klasach S4 przedstawione są w tabeli 2.6,
Tabela 2.6: Funkcje z pakietu methods do operacji na klasach lub obiektach klas
••V
slotNames(x) |
Argumentem może być nazwa kasy lub jej obiekt. Wy-uikicra tej fuukcji są informacje o nazwach slotów w tej klasie. |
isClassUnion(class) |
Test czy klasa class jest zbiorem klas. |
is(object, class2) |
Test czy obiekt object jest obiektem klasy class2 lub jej podklasy. |
as(object, class2) |
Konwersja obiektu object na obiekt klasy class2. |
extends(class 1, class2) Czy klasa classl jest rozszerzeniem class2? |
‘-Ct Wm
formula to symboliczny opis zależności pomiędzy zmiennymi. Formuły są najczęściej wykorzystywane do opisu postaci modelu liniowego, logistycznego lub innego (patrz rozdział poświęcony statystyce). Formuły mogą być też wykorzystywane do wskaza-V nia zbioru zmiennych, które mają być graficznie przedstawione lub które mają być poddane jakiejś operacji. Obiekty zawierające formuły mogą być argumentami wielu funkcji statystycznych i statystyk opisowych. Wiele funkcji (patrz np. wykres rozrzu-Ąf.7' tu, wykres pudełkowy itp.) umożliwia podanie argumentów wejściowych w postaci zbioru wektorów lub w postaci formuły. Składnia formuły jest następująca:
Lewa.strona " Prawa, strona
Lewa. strona to najczęściej jedna zmienna (zmienna objaśniana), Prawa. strona to zbiór termów rozdzielanych znakiem + (zmienne objaśniające). Termem mogą być nazwy zmiennych lub nazwy zmiennych separowane znakiem : (tym znakiem oznacza się interakcje pomiędzy zmiennymi). Poniżej kilka przykładowych formuł.
8 formula opisująca zależność pomiędzy dwoma zmiennymi
8 formula opisująca addytyumą zależność y od dwóch zmiennych y‘ " a + b
# formula opisująca addytyumą zależność od dwóch zmiennych i ich interakcji
W formułach można stosować też inne symbole:
• Znak * oznacza wszystkie zmienne i interakcje pomiędzy zmiennymi, czyli np. a*b = a+b+a:b.
wm
• Znak ‘/.in*/. oznacza termy po lewej zagnieżdżone w termach po prawej, przykładowo: (a+b) ‘/.in’/, c = a:c + b:c.
V-
81 ii'
• Znak / oznacza termy po lewej występujące samodzielnie i w interakcji z prawą stroną, przykładowo: a/b = a + a:b.
• Znak ~n oznacza wszystkie zmienne i interakcje n-tego rzędu pomiędzy danymi zmiennymi, przykładowo:
(a+b+c)~2 = (a+b+c)*(a+b+c) = a + b + c + a:b + a:c + b:c.
• Znak - powoduje usunięcie wskazanego termu z formuły, przykładowo: a*b - a = b + a:b.
•y.?;
1'ypy zmiennych i operacje na nich
85
Specjalne znaczenie ma term -1, który powoduje usunięcie z modelu wyrazu wolnego. Identyczny efekt można otrzymać dodając term +0. W formule można wykorzystywać funkcje arytmetyczne i inne funkcje R. Poprawnymi formułami są:
log(y) ‘ a + log(b) y ezp(a + b) y. r sqrt(b) + a y * ifelse(a>0, b, c)