SAS - มาโคร
SAS มีคุณสมบัติการเขียนโปรแกรมที่มีประสิทธิภาพที่เรียกว่า Macrosซึ่งช่วยให้เราหลีกเลี่ยงส่วนที่ซ้ำซากของโค้ดและใช้ซ้ำแล้วซ้ำอีกเมื่อจำเป็น นอกจากนี้ยังช่วยสร้างตัวแปรแบบไดนามิกภายในโค้ดที่สามารถรับค่าที่แตกต่างกันสำหรับอินสแตนซ์การรันที่แตกต่างกันของโค้ดเดียวกัน นอกจากนี้ยังสามารถประกาศมาโครสำหรับบล็อกโค้ดซึ่งจะถูกนำมาใช้ซ้ำหลายครั้งในลักษณะเดียวกันกับตัวแปรมาโคร เราจะเห็นทั้งสองอย่างนี้ในตัวอย่างด้านล่าง
ตัวแปรมาโคร
นี่คือตัวแปรที่เก็บค่าไว้เพื่อใช้ซ้ำแล้วซ้ำอีกโดยโปรแกรม SAS จะมีการประกาศเมื่อเริ่มต้นโปรแกรม SAS และจะถูกเรียกออกในภายหลังในเนื้อหาของโปรแกรม สามารถเป็น Global หรือ Local ในขอบเขตได้
ตัวแปร Global Macro
เรียกว่าตัวแปรมาโครส่วนกลางเนื่องจากสามารถเข้าถึงได้โดยโปรแกรม SAS ที่มีอยู่ในสภาพแวดล้อม SAS โดยทั่วไปเป็นตัวแปรที่ระบบกำหนดให้ซึ่งเข้าถึงได้โดยหลายโปรแกรม ตัวอย่างทั่วไปคือวันที่ของระบบ
ตัวอย่าง
ด้านล่างนี้เป็นตัวอย่างของตัวแปร SAS ที่เรียกว่า SYSDATE ซึ่งแสดงถึงวันที่ของระบบ พิจารณาสถานการณ์จำลองเพื่อพิมพ์วันที่ของระบบในชื่อของรายงาน SAS ทุกวันที่สร้างรายงาน ชื่อเรื่องจะแสดงวันที่และวันปัจจุบันโดยที่เราไม่ได้เข้ารหัสค่าใด ๆ ให้ เราใช้ชุดข้อมูล SAS ในตัวที่เรียกว่า CARS ที่มีอยู่ในไลบรารี SASHELP
proc print data = sashelp.cars;
where make = 'Audi' and type = 'Sports' ;
TITLE "Sales as of &SYSDAY &SYSDATE";
run;
เมื่อรันโค้ดด้านบนเราจะได้ผลลัพธ์ต่อไปนี้
ตัวแปร Local Macro
ตัวแปรเหล่านี้สามารถเข้าถึงได้โดยโปรแกรม SAS ซึ่งมีการประกาศให้เป็นส่วนหนึ่งของโปรแกรม โดยทั่วไปจะใช้เพื่อจัดหา varaibels ที่แตกต่างกันให้กับคำสั่ง SAS sl เดียวกันซึ่งสามารถประมวลผลข้อสังเกตที่แตกต่างกันของชุดข้อมูลได้
ไวยากรณ์
ตัวแปรโลคัลถูกทำลายด้วยไวยากรณ์ด้านล่าง
% LET (Macro Variable Name) = Value;
ที่นี่ช่อง Value สามารถรับค่าตัวเลขข้อความหรือวันที่ตามที่โปรแกรมต้องการ ชื่อตัวแปรมาโครคือตัวแปร SAS ที่ถูกต้อง
ตัวอย่าง
ตัวแปรถูกใช้โดยคำสั่ง SAS โดยใช้ & อักขระต่อท้ายชื่อตัวแปร โปรแกรมด้านล่างนี้ทำให้เราทุกคนสังเกตเห็นรถยนต์ 'Audi' และประเภท 'Sports' ในกรณีที่เราต้องการผลลัพธ์ของdifferent makeเราจำเป็นต้องเปลี่ยนค่าของตัวแปร make_nameโดยไม่ต้องเปลี่ยนส่วนอื่น ๆ ของโปรแกรม ในกรณีของโปรแกรมนำตัวแปรนี้สามารถอ้างอิงซ้ำแล้วซ้ำอีกในคำสั่ง SAS ใด ๆ
%LET make_name = 'Audi';
%LET type_name = 'Sports';
proc print data = sashelp.cars;
where make = &make_name and type = &type_name ;
TITLE "Sales as of &SYSDAY &SYSDATE";
run;
เมื่อรันโค้ดด้านบนเราจะได้ผลลัพธ์เดียวกันกับโปรแกรมก่อนหน้า แต่เรามาเปลี่ยนไฟล์type name ถึง 'Wagon'และรันโปรแกรมเดียวกัน เราจะได้ผลลัพธ์ด้านล่าง
โปรแกรมมาโคร
มาโครคือกลุ่มของคำสั่ง SAS ที่อ้างถึงด้วยชื่อและใช้ในโปรแกรมได้ทุกที่โดยใช้ชื่อนั้น เริ่มต้นด้วยคำสั่ง% MACRO และลงท้ายด้วยคำสั่ง% MEND
ไวยากรณ์
ตัวแปรท้องถิ่นถูกประกาศด้วยไวยากรณ์ด้านล่าง
# Creating a Macro program.
%MACRO <macro name>(Param1, Param2,….Paramn);
Macro Statements;
%MEND;
# Calling a Macro program.
%MacroName (Value1, Value2,…..Valuen);
ตัวอย่าง
โปรแกรมด้านล่างนี้เป็นกลุ่มของ SAT staemnets ภายใต้มาโครที่ชื่อ 'show_result'; มาโครนี้ถูกเรียกโดยคำสั่ง SAS อื่น
%MACRO show_result(make_ , type_);
proc print data = sashelp.cars;
where make = "&make_" and type = "&type_" ;
TITLE "Sales as of &SYSDAY &SYSDATE";
run;
%MEND;
%show_result(BMW,SUV);
เมื่อรันโค้ดด้านบนเราจะได้ผลลัพธ์ต่อไปนี้
มาโครที่ใช้กันทั่วไป
SAS มีคำสั่ง MACRO จำนวนมากซึ่งสร้างขึ้นในภาษาโปรแกรม SAS โปรแกรมเหล่านี้ถูกใช้โดยโปรแกรม SAS อื่น ๆ โดยไม่ได้ประกาศอย่างชัดเจนตัวอย่างทั่วไปคือ - การยุติโปรแกรมเมื่อตรงตามเงื่อนไขบางประการหรือจับค่ารันไทม์ของตัวแปรในบันทึกโปรแกรม ด้านล่างนี้คือตัวอย่างบางส่วน
มาโคร% PUT
คำสั่งแมโครนี้เขียนข้อความหรือข้อมูลตัวแปรแมโครไปยังบันทึก SAS ในตัวอย่างด้านล่างค่าของตัวแปร "today" ถูกเขียนลงในบันทึกของโปรแกรม
data _null_;
CALL SYMPUT ('today',
TRIM(PUT("&sysdate"d,worddate22.)));
run;
%put &today;
เมื่อรันโค้ดด้านบนเราจะได้ผลลัพธ์ต่อไปนี้
ผลตอบแทนมาโคร%
การดำเนินการของมาโครนี้ทำให้แมโครที่กำลังดำเนินการสิ้นสุดตามปกติเมื่อเงื่อนไขบางอย่างประเมินว่าเป็นจริง ในตัวอย่างด้านล่างเมื่อค่าของตัวแปร"val" กลายเป็น 10 มาโครจะยุติมิฉะนั้นจะเกิดขึ้น
%macro check_condition(val);
%if &val = 10 %then %return;
data p;
x = 34.2;
run;
%mend check_condition;
%check_condition(11) ;
เมื่อรันโค้ดด้านบนเราจะได้ผลลัพธ์ต่อไปนี้
มาโคร% END
นิยามมาโครนี้ประกอบด้วยไฟล์ %DO %WHILEลูปที่สิ้นสุดตามต้องการด้วยคำสั่ง% END ในตัวอย่างด้านล่างแมโครที่มีชื่อว่า test รับอินพุตของผู้ใช้และรัน DO loop โดยใช้ค่าอินพุตนี้ การสิ้นสุดของลูป DO ทำได้โดยใช้คำสั่ง% end ในขณะที่การสิ้นสุดของมาโครทำได้โดยใช้คำสั่ง% mend
%macro test(finish);
%let i = 1;
%do %while (&i <&finish);
%put the value of i is &i;
%let i=%eval(&i+1);
%end;
%mend test;
%test(5)
เมื่อรันโค้ดด้านบนเราจะได้ผลลัพธ์ต่อไปนี้