классы в RS3-класи -найстаріші в R, проте переважна більшість вбудованих об'єктів написані саме в цій логіці. Спробуємо розглянути на прикладі побудову типового класу S3. Візьмемо довільну вибірку і виконаємо деякі базові компоненти.

При цьому тримаємо в думці три основні властивості ООП: інкапсуляцію, наслідування, поліморфізм.

Отже, інкапсуляція.

Створити клас не складно. Досить виконати:


x<--c(1,2,3)
ff<--list(x=x, me=meam(x))
class(ff)<-"ff"

І (о,диво!)ми можемо перевірити в консолі результат наступним набором команд:

> ff <- list(x = x,mean=mean(x))
> class(ff) <- "ff"
> ff$x
[1] 1 2 3
> ff$mean
[1] 2

Наче все добре! І об'єкт існує, і навіть обчислює середнє, але спробуємо далі поексперементувати. Змінимо вектор x (додамо ще чисел).

> ff$x <- c(ff$x,5,6,7)
> class(ff)
[1] "ff"
> ff$x
[1] 1 2 3 5 6 7
> ff$mean
[1] 2
> mean(ff$x)
[1] 4

Ефект, прямо скажемо не радує! Спробуємо просто присвоїти:

> ff <- c(ff$x,5,6,7,8)
> class(ff)
[1] "numeric"

Все поламалося. Шкода, подивимося, що ж робити.

Наведемо наш клас до звичної форми:

#
# аналог ctor'а для класса fm
#
fm_create <- function(x){
fn <- list()# ќб¤зательно!!!!
fn$x <- x
fn$mean <<- mean(x)
fn$median <<- median(x)
fn$sd <<- sd(x)
class(fm_create) <- "fm"# обязательно!!!!
return(fm_create)# обязательно!!!!
}

Стало краще, але не набагато. Перевантажимо для початку оператори читання і запису.

А, взагалі-то, працює.

> n <- 60
> x <- (1:n)/n
> y <- rnorm(n,mean = mean(x),sd=sd(x))
> ff.obj <- fm_create(y)
> ff.obj$mean
[1] 0.5086667
> ff.obj$median
[1] 0.4787275
>
> ff.obj$median
[1] 0.4787275
>
> ff.obj$sd
[1] 0.2961263
>

Далі, все буде !