BookmarkSubscribeRSS Feed
Hagay
SAS Employee

הדרך השלישית, והאחרונה, ליצירה של משתני מאקרו היא בעזרת data step ע"י שימוש בפונקציה CALL SYMPUT. בעזרת פונקציה זו ניתן ליצר משתני מאקרו באופן דינמי לחלוטין מכיוון שאנחנו יכולים לשלוט גם על השם שלהם ולא רק על הערכים המוכלים בהם.

 

חדי העין ודאי שמו לב שלמרות שקראתי לה פונקציה היא לא באמת פונקציה אלא משהו שנקרא ב – SAS-ית CALL ROUTINE. ההבדל הוא שבעוד שפונקציה מחזיר ערך CALL ROUTINE לא. לשם הפשטות אני אקרא גם ל – CALL ROUTINES פונקציות – חוסך לי קצת הקלדה.

 

השימוש שלה הוא די פשוט:

data _null_;
	set sashelp.class;
	call symput('last_name', name);
run;
%put &=last_name;

כל פעם ש -  SAS קוראת שורה מהטבלה היא שומרת במשתנה מאקרו את הערך שאמרנו לה ולכן בקוד שלמעלה קיבלנו בסופו של דבר במשתנה המאקרו את השם ברשומה האחרונה בטבלה – כל רשומה נוספת דרסה את השם הקודם בתוך משתנה המאקרו.

 

כמובן שאנחנו יכולים לשלוט על הערך שנשמור בעזרת יכולות ה – data step שלנו שלמדנו בחודשים האחרונים:

data _null_;
	set sashelp.class;
	if _n_=1 then call symput('first_name', name);
run;
%put &=first_name;
data _null_;
	set sashelp.class;
	if sex='F' then counter+1;
	if sex='F' and counter=3 then call symput('third_female', name);
run;

%put &=third_female;

כפי שציינתי ניתן בעזרת CALL SYMPUT גם לקבוע באופן דינמי את השם של משתני המאקרו שאנחנו יוצרים:

data _null_;
	set sashelp.class;
	call symput(cats('student', put(_n_, z2.)), name);
run;
%put _user_; * Shows all user macro variables;

בשבוע שעבר כאשר ראינו איך שומרים משתני מאקרו מ – proc sql ציינתי את האופציה trimmed אשר מורידה רווחים מיותרים כאשר אנחנו שומרים מספרים. ניתן להשיג תוצאה דומה ע"י שימוש בפונקציה CALL SYMPUTX שעובדת בדיוק כמו CALL SMYPUT רק שהיא מורידה קודם רווחים:

data _null_;
	set sashelp.class;
	if _n_=1 then do;
		call symput('age_spaces', age);
		call symputx('age_no_spaces', age);
		stop;
	end;
run;
%put &=age_spaces; * Note the spaces and the NOTE in the log;
%put &=age_no_spaces; * No spaces - Tadaa!;

חגי