классы в 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
>

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