Назва статті
 

Аналіз даних

1

Статистический анализ для бизнесаСтатистичній аналiз для бизнесу

2

Язык программирования R. Функция заменыФункція заміни в R

3

Нотатки по об'єктно-орієнтованому програмуванню в R

S3-классы в RНотаток 1. S3-класи в R

Нотаток 2. Поліморфізм в S3 класах

 

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

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

Функція заміни - це вираз виду:

f(x)<-y,

Воно еквівалентно:
x <- "f" <-(x, value = y),
при цьому необхідно визничити заздалегідь f <- (). При визначенні слід пам'ятати, що вона завжди буде мати іменнованний параметр value&nbsp=.

Функція в R - це об'єкт, що складається з аргументів, тіла і оточення (environment), тобто формально вона є замиканням (closure). Для роботи з об'єктами оточення можна використовувати функцію "<<-":

f <- function(u){
u<<- 2 * u
}

Якщо виконати команду:

> u
Error object "u" not found
> f(5)
> u
[1] 10

Взагалі-то, << - використовується для запису в змінну верхнього рівня, але, насправді, він запускає процес висхідного виклику по ієрархії оточення ("матрьошка") і шукає перший рівень, на якому цей об'єкт виявлений:

f <- function(){
int <- function(){ x<<- x+1}
x <- 3
int()
return(x)
}

> f()
[1] 4
> x
Error object "u" not found

До речі, в R багато можливостей зробити  туж саму дію декількома способами:


x <<- x+1

эквивалентно:
assign("x", x+1, pos = .GlobalEnv)