הגדרת מחלקות הפניה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 37 מתוך 57.
מחלקות ייחוס (RC) הן המערכת של R לאובייקטים שמשתנים במקום, כמו ב-Java או ב-Python. setRefClass() מצהירה על מחלקה עם שדות מטיפוסים מוגדרים ומחזירה מחולל; $new() יוצרת אובייקט, ו-$ קוראת את השדות ומשנה אותם:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
a$balance <- a$balance + 50
cat(a$owner, a$balance)פלט:
Ada 150אובייקט RC הוא הפניה, כמו סביבה. השמה שלו למשתנה אחר או העברתו לפונקציה לא מעתיקה אותו, ולכן שינוי דרך כל שם הוא שינוי של אותו אובייקט:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
pay_fee <- function(acc) acc$balance <- acc$balance - 5
a <- Account$new(owner = "Ada", balance = 100)
b <- a
b$balance <- 60
pay_fee(a)
cat(a$balance, b$balance)פלט:
55 55לשדות יש טיפוסים. הקצאת ערך מהמחלקה הלא נכונה נדחית, והשדה שומר על הערך הישן שלו:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
msg <- tryCatch({ a$balance <- "lots"; "changed" }, error = function(e) conditionMessage(e))
cat(msg, "\n")
cat(a$balance, "\n")פלט:
invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”)
100 הגנרטור מתאר את המחלקה: Account$fields() מציג את השדות ואת הטיפוסים שלהם. אובייקט שמודפס ללא מתודת show מציג את השדות שלו; שדה שלא הוזן עבורו ערך נשאר ריק:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")פלט:
owner balance
"character" "numeric"
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)אתגר
קלהכריזו על מחלקת Reference בשם Book בקובץ Book.R עם השדות title ו-author (תווים) ו-pages (מספרי), והשאירו את המחולל בתוך Book. לאחר מכן כתבו את add_pages(book, n), שמוסיפה את n למספר העמודים של הספר במקום, ולא מחזירה ערך שימושי.
הקוד שסופק קורא את title;author;pages, יוצר את הספר, מעביר אותו למשתנה שני, מוסיף את המספרים הנותרים דרך השם השני הזה, ומדפיס את הספר המקורי ואת שמות השדות.
הקוד שלכם צריך להופיע ב-Book.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
source("Book.R")
# קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ";")[[1]]
b <- Book$new(title = p[1], author = p[2], pages = as.numeric(p[3]))
alias <- b
for (n in as.numeric(input[-1])) add_pages(alias, n)
cat(b$title, " by ", b$author, ": ", b$pages, " pages\n", sep = "")
cat("fields: ", paste(names(Book$fields()), collapse = ", "), "\n", sep = "")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורותתרגלו בעצמכם: קומפיילר R אונליין