R sinflari va ob'ektlari


Download 29.35 Kb.
bet2/3
Sana18.09.2023
Hajmi29.35 Kb.
#1680721
1   2   3
Bog'liq
R sinflari va ob

Yo'naltiruvchi sinf
Qolgan ikkitasi bilan taqqoslaganda, ma'lumotnoma keyinchalik kiritildi. Bu biz boshqa asosiy dasturlash tillarida ko'rishga odatlangan ob'ektga yo'naltirilgan dasturlashga o'xshaydi.
Ma'lumot sinflari, asosan, unga qo'shilgan muhit bilan S4 sinflanadi.
3-misol: Ma'lumot sinf
S3 va S4 va Reference Class o'rtasidagi taqqoslash





































R S3 sinfi


Ushbu qismda siz S3 sinflari bilan ishlashni o'rganasiz (R dasturlashdagi uchta sinf tizimlaridan biri).
S3 klassi R dasturlash tilidagi eng mashhur va keng tarqalgan sinfdir.
Oldindan belgilangan R sinfida keltirilgan sinflarning aksariyati shu turga kiradi. Buning sodda va oson amalga oshirilganligi bunga sababdir.
S3 sinfini qanday aniqlash va S3 moslamalarini yaratish?
S3 sinfining rasmiy, oldindan belgilangan ta'rifi yo'q.
Asosan, sinf atributi ba'zi bir sinf nomiga o'rnatilgan ro'yxat S3 ob'ekti hisoblanadi. Ro'yxat tarkibiy qismlari ob'ektning o'zgaruvchisiga aylanadi.
Quyida sinf o'quvchisining S3 ob'ekti qanday yaratilishi mumkinligi haqida oddiy misol keltirilgan.
> # create a list with required components
> s <- list(name = "John", age = 21, GPA = 3.5)
> # name the class appropriately
> class(s) <- "student"
> # That's it! we now have an object of class "student"
> s
$name
[1] "John"
$age
[1] 21
$GPA
[1] 3.5
attr(,"class")
[1] "student"
Bu C ++, Python va boshqalardan kelib chiqadigan dasturchilar uchun noqulay ko'rinishi mumkin, bu yerda rasmiy sinf ta'riflari mavjud va ob'ektlar to'g'ri belgilangan atributlar va usullarga ega.
R S3 tizimida bu juda vaqtinchalik. Siz o'zingizning xohishingizga ko'ra ob'ekt sinfini bir xil sinfdagi ob'ektlar bilan butunlay boshqacha ko'rinishga o'tkazishingiz mumkin. Hammasi sizga bog'liq.
Ob'ektlarni yaratish uchun konstruktorlardan qanday foydalanish kerak?
Ob'ektlarni yaratish uchun sinf bilan bir xil nomdagi (zarurat emas) funktsiyadan foydalanish yaxshi amaliyotdir.
Bu ob'ektlarni yaratishda bir xillikni keltirib chiqaradi va ularni o'xshash qilib qo'yadi.
Shuningdek, a'zoning atributlarida bir necha yaxlitlik tekshiruvini qo'shishimiz mumkin. Mana bir misol. Ushbu misolda biz ob'ektning sinf atributini o'rnatish uchun attr () funktsiyasidan foydalanamiz.
# a constructor function for the "student" class
student <- function(n,a,g) {
# we can add our own integrity checks
if(g>4 || g<0) stop("GPA must be between 0 and 4")
value <- list(name = n, age = a, GPA = g)
# class can be set using class() or attr() function
attr(value, "class") <- "student"
value
}
Mana, biz ushbu konstruktor yordamida ob'ektlarni yaratadigan ishga namuna:
> s <- student("Paul", 26, 3.7)
> s
$name
[1] "Paul"
$age
[1] 26
$GPA
[1] 3.7
attr(,"class")
[1] "student"
> class(s)
[1] "student"
> s <- student("Paul", 26, 5)
Error in student("Paul", 26, 5) : GPA must be between 0 and 4
> # these integrity check only work while creating the object using constructor
> s <- student("Paul", 26, 2.5)
> # it's up to us to maintain it or not
> s$GPA <- 5
Usullar va umumiy funktsiyalar
Yuqoridagi misolda, biz shunchaki ob'ekt nomini yozganimizda, uning ichki qismlari bosilib chiqadi.
Interaktiv rejimda faqat ismni yozish uni print () funktsiyasi yordamida bosib chiqaradi.
> s
$name
[1] "Paul"
$age
[1] 26
$GPA
[1] 3.7
attr(,"class")
[1] "student"
Bundan tashqari, biz vektorlar, matritsalar, ma'lumotlar ramkalari, omillar va boshqalar bilan print () dan foydalanishimiz mumkin va ular tegishli bo'lgan sinfga ko'ra har xil bosilib chiqadi.
Print () bu xilma-xil ko'rinadigan ob'ektni qanday bosib chiqarishni qanday biladi?
Javob: print () umumiy funktsiya. Aslida, u bir qator usullar to'plamiga ega. Ushbu usullarning barchasini usullar bilan tekshirishingiz mumkin (chop etish).
> methods(print)
[1] print.acf*
[2] print.anova*
...
[181] print.xngettext*
[182] print.xtabs*
Non-visible functions are asterisked
Yuqoridagi ro'yxatda print.data.frame va print.factor kabi usullarni ko'rishimiz mumkin.
Ma'lumotlar freymida print () deb nomlaganimizda, u print.data.frame () ga yuboriladi.
Agar biz xuddi shu narsani faktor bilan bajargan bo'lsak, qo'ng'iroq print.factor () ga yuboriladi. Bu erda usul nomlari generic_name.class_name () shaklida bo'lishini kuzatishimiz mumkin. R sinfga qarab qanday usulni chaqirishni aniqlay oladi.
Bizning "talaba" sinfimiz ob'ektini chop etish print.student () shaklining usulini qidiradi, ammo bu shaklning usuli yo'q.
Xo'sh, bizning "talaba" sinfimiz ob'ekti qaysi usulni chaqirdi?
Print.default () deb nomlangan. Bu mos keladigan usul, agar boshqa mos kelmasa topiladi. Umumiy funktsiyalar standart usulga ega.
Print () kabi umumiy funktsiyalar juda ko'p. Ularning barchasini usullar bilan ro'yxatlashingiz mumkin (class = "default").
> methods()
[1] add1.default* aggregate.default*
[3] AIC.default* all.equal.default
...
O'zingizning usulingizni qanday yozish kerak?
Endi print.student () usulini o'zimiz amalga oshiraylik.
print.student <- function(obj) {
cat(obj$name, "\n")
cat(obj$age, "years old\n")
cat("GPA:", obj$GPA, "\n")
}
Endi biz ushbu usul "talaba" sinfining ob'ektini () har qachon bosib chiqarsak ham chaqiriladi.
S3 tizimida usullar ob'ektga yoki sinfga tegishli emas, ular umumiy funktsiyalarga tegishli. Bu ob'ektning sinfi o'rnatilgan ekan ishlaydi.
> # our above implemented method is called
> s
Paul
26 years old
GPA: 3.7
> # removing the class attribute will restore as previous
> unclass(s)
$name
[1] "Paul"
$age
[1] 26
$GPA
[1] 3.7
O'zingizning umumiy funktsiyangizni yozing
Print () yoki plot () kabi umumiy funktsiyamizni bajarishimiz mumkin. Avval ushbu funktsiyalar qanday amalga oshirilishini ko'rib chiqamiz.
> print
function (x, ...)
UseMethod("print")


> plot
function (x, y, ...)
UseMethod("plot")


Ularda umumiy funktsiya nomi berilgan, UseMethod () ga bitta qo'ng'iroq borligini ko'rishimiz mumkin. Bu barcha fon tafsilotlarini boshqaradigan dispetcher funktsiyasi. Umumiy funktsiyani amalga oshirish juda oddiy.
Masalan, biz sinf deb nomlangan yangi umumiy funktsiyani qilamiz.
grade <- function(obj) {
UseMethod("grade")
}
Umumiy funktsiya hech qanday usulsiz foydasizdir. Standart usulni amalga oshiraylik.
grade.default <- function(obj) {
cat("This is a generic function\n")
}
Endi sinfimiz "o'quvchisi" uchun metodikani yarataylik.
grade.student <- function(obj) {
cat("Your grade is", obj$GPA, "\n")
}
Namuna.
> grade(s)
Your grade is 3.7
Shu tarzda biz sinf deb nomlangan umumiy funktsiyani va keyinchalik sinfimiz uchun usulni amalga oshirdik.

Download 29.35 Kb.

Do'stlaringiz bilan baham:
1   2   3




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling