84 pazuRrry
Klasa może zawierać również funkcje. Szczególnie przydatne jest określenie funjcS cji initializeO, która wywoływana jest przy inicjacji nowego obiektu klasy. Pij niżej przykład definicji funkcji, pilnującej by wiek przyjmował rozsądne wartości,
setMethodCinitialize", "osoba",
function(.Object, imię = character("Nieznane"), wiek = numeric(O)) if (nargsO > 1) {
if (wiek > 120 I I wiek < 0) -
stopCNiedopuszczalna wartość dla slotu wiek")
.ObjectSimie <- imię •ObjectOwlek <- wiek
>
.Object
»
Sprawdźmy teraz, czy to zadziała.
> obiektOsoba <- newCosoba", i mie*"Przemek" , wiek=2700)
Error in . lę>cal( .Object, ...) : Niedopuszczalna wartość dla slotu wiek
Klasy można łączyć w zbiory klas. Obiektem takiego zbioru może być obiekip dowolnej z klas składowych. Jest to wygodny mechanizm, gdy chcemy, aby np. k slot mógł przyjmować wartości różnych typów. Zbiory klas można tworzyć funkfj cją setClassUnion(methods). Zdefiniujmy taki przykładowy zbiór przechowują liczby lub łańcuchy znaków.
> setClassUnion("lięzbaNapis", cOnumeric", "character"))
Możemy teraz zmodyfikować deklaracje klasy osoba, tak by dopuścić podawanie^ wieku nie tylko liczbowo, ale też opisowo.
> setClass("osoba2", representation(imie«"character", wiek="liczbaNapisl!
> tt nie będzie sygnalizowany błąd, wiek może być liczbą lub napisem
> obiekt0soba2 <- new("osoba2", imie-"Przemek", wiek="dorosly")
Wybrane funkcje do operowania na klasach S4 przedstawione są w tabeli 2.6. yM Tabela 2.6: Funkcje z pakietu methods do operacji na klasach lub obiektach klas
slotNames(x) |
Argumentem może być nazwa kasy lub jej obiekt. Wynikiem tej funkcji są informacje o nazwach slotów w tej klasie. |
■'źfi |
isClassUnion(class) |
Test czy klasa class jest zbiorem klas. | |
is(object, cla8s2) |
Test czy obiekt object jest obiektem klasy class2 lub jej podklasy. | |
as(object, class2) |
Konwersja obiektu object na obiekt klasy claes2. | |
extends(classl, class2) |
Czy klasa classl jest rozszerzeniem class2? |
Ipffinnula to symboliczny opis zależności pomiędzy zmiennymi. Formuły są najczęściej wykorzystywane do opisu postaci modelu liniowego, logistycznego lub innego (patrz sk^i^jział poświęcony statystyce). Formuły mogą być też wykorzystywane do wskaza-' • nm zbioru zmiennych, które mają być graficznie przedstawione lub które mają być i J poddane jakiejś operacji. Obiekty zawierające formuły mogą być argumentami wielu funkcji statystycznych i statystyk opisowych. Wiele funkcji (patrz np. wykres rozrzutu. 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 jplpplifcriacza się interakcje pomiędzy zmiennymi). Poniżej kilka przykładowych formuł.
■ ■ ? S.:.. • ■ :
• 'k/ formoi a opisująca zależność pomiędzy dwoma zmiennymi
# formula opisująca addytyumą zależność y od dwóch zmiennych jr " a + b
df formula opisująca addytyumą zależność od dwóch zmiennych i ich interakcji f.y * a + b + a:b
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.
• Znak ‘/.in*/. oznacza termy po lewej zagnieżdżone w termach po prawej, przy-•5 . . kładowo: (a+b) Kin’/, c = a:c + b:c.
• 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.
i.. 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) e*p(a + b)
J ' 6qrt(b) + a
£? * ifelse(a>0, b, c)