עבודה עם קבצים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 1 מתוך 57.
תוכניות אמיתיות מפוצלות לכמה קבצים. ב-R, source("Greeting.R") מריצה קובץ אחר מתחילתו ועד סופו, וכל פונקציה שהקובץ מגדיר זמינה לאחר מכן:
# Greeting.R
greeting <- function(name) {
paste0("Hello, ", name, "!")
}
# main.R
source("Greeting.R")
cat(greeting("Ada"), "\n")הרצת main.R מדפיסה Hello, Ada!: שורת source() טוענת את greeting() לפני ש-main.R קוראת לה.
התוכנית מתחילה בקובץ שמריצים, כאן main.R, ו־R קוראת אותו שורה אחר שורה. לסדר יש חשיבות: פונקציה קיימת רק לאחר שהקובץ שמגדיר אותה נטען באמצעות source, לכן שורות source() מופיעות למעלה:
# main.R
cat(greeting("Ada"), "\n") # שגיאה: לא נמצאה הפונקציה "greeting"
source("Greeting.R")
cat(greeting("Ada"), "\n") # עובד: greeting() קיימת כעתהפריסה המקובלת היא מחלקה אחת לכל קובץ, ושם הקובץ זהה לשם המחלקה: Account.R מכיל את הבנאי account ואת המתודות שלו, Shape.R מכיל את הגנריקות shape. באתגרים של יחידה זו, הקוד שלך ייכתב בקבצים האלה, ו-main.R מכיל את קוד הקלט/פלט שסופק, כאשר שורות source() כבר מופיעות בראשו בסדר הנכון. העורך מציג כל קובץ כלשונית.
Shape.R # פונקציות גנריות המשותפות לכל צורה: יש לטעון אותן תחילה
Circle.R # מחלקת המעגל והמתודות שלה
main.R # source("Shape.R"); source("Circle.R"); קורא קלט ומדפיס תוצאותsource() מריצה קובץ בסביבת הסביבה הגלובלית, ולכן הפונקציות והמשתנים שלו הופכים לשמות גלובליים. ל-R אין שמות פרטיים לקובץ: אם שני קבצים מגדירים את helper(), הקובץ שנטען אחרון הוא הקובע. גם ערך שמופיע בשורה בפני עצמו בקובץ שנטען לא יודפס, ולכן קבצים שאמורים להציג משהו קוראים ל-cat():
# Tools.R
total <- 0 # משתנה גלובלי לאחר טעינת הקובץ
42 # לא מודפס על ידי source()
helper <- function(x) x * 2
# Other.R
helper <- function(x) x + 1 # נטען מאוחר יותר: מחליף את helper שלמעלהאתגר
קלהתוכנית כוללת שני קבצים. main.R טוען את Greeting.R, קורא שמות ומדפיס את התוצאה של greeting(name) עבור כל אחד מהם. השלימו את greeting() בתוך Greeting.R כך שתחזיר Hello, Ada! עבור השם Ada, או Hello, friend! כאשר השם ריק.
הקוד שלכם ייכתב בתוך Greeting.R. הקובץ main.R מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.
נסו בעצמכם
source("Greeting.R")
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
for (name in input) cat(greeting(name), "\n", sep = "")
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות S3
עבודה עם קבציםרשימות עם מחלקהפונקציות בנאימתודות print ו-formatמאמתים ופונקציות עזרחזרה – טמפרטורותתרגלו בעצמכם: קומפיילר R אונליין