לפעמים האבלואציה העצלנית של R מוציאה אותי מדעתי. אני רוצה להכניס לרשימה מספר פונקציות (לקריאה מאוחרת שלהן). כל פונקציה נסמכת קצת על קודמתה. הנה קוד שמתאר משהו דומה (תקראו את הקוד, תבינו מה אני רוצה. אבל R לא אוהב את הקוד הזה)
f = function(x) x
fl = list(f)
for (i in 2:10) {
fl[[i]] = function(x) fl[[i-1](x)+1
}
בקיצור הפונקציה הראשונה היא פונקצית הזהות, וכל פונקציה מחזירה ערך הגדול באחד ממה שהפונקציה הקודמת מחזירה.
אבל זה לא עובד!!!!!
האבלואציה העצלנית של R גורמת לזה שהפונקציה שנכנסת לרשימה עוד לא נוצרה. היא נוצרת רק כשקוראים לה (למשל)
fl[[3]](5)
אבל אז לא בטוח שi מוגדר בכלל. ספציפית אם מנסים לעשות זאת מיד אחרי הלולאה הנ"ל, אז הערך של i הוא 10, אז הקריאה לפונקציה שלי מנסה לבדוק את הערך של הפונקציה ה9 ברשימה, שגם היא לא נוצרה, אז הוא מנסה ליצור אותה, שוב, הוא בודק את הערך של i (עדיין 10), ולכן הוא שוב מנסה לבדוק את הפונקציה ה9 ברשימה. לולאה אינסופית של אבלואציה. אם מנסים לעשות זאת כש i לא מוגדר, אז R צועק שחסר לו המשתנה הזה.
ואני שואל - כיצד? כיצד אפשר להגדיר רשימת פונקציות כמו שאני צריך? איך אפשר לגרום לR להעריך את הביטוי ברגע הכנסתו לביטוי הבא (כלומר להעריך את i, או אפילו יותר טוב, להעריך את fl[[i-1] בזמן ההשמה לתוך fl[[i]]?
אוף....