SAS宏是一种强大的工具,它允许程序员通过定义可重用的代码片段来简化和自动化常见的编程任务。宏使得代码更加模块化,易于维护,并且可以减少编写相同或相似SAS语句的次数。本文将详细介绍如何定义和使用SAS宏,包括宏变量和宏程序的创建,以及如何利用宏变量的默认值和自动宏变量。
在SAS中,宏变量和宏程序是通过特殊的语法定义的。宏变量以一个字符字符串或一组SAS编程语句的名称来表示,而宏程序则是一段可以重复使用的代码。宏变量的名称以前缀“&”标识,宏程序的名称以前缀“%”标识。宏变量类似于标准数据变量,但它只包含单一值,不属于任何数据集,其值始终是字符形式的,可以是变量名、数字或任何希望在程序中替换的文本。
如果发现自己在编写相同或相似的SAS语句,那么应该考虑使用宏。宏允许将一段经过测试的代码打包,并在单个SAS程序或多个SAS程序中重复使用。可以将宏想象成三明治,%MACRO和%MEND语句就像两片面包,中间可以夹入任何想要的语句。
使用%LET语句定义宏变量。例如:
%let macro_var = risk_score;
在代码中引用宏变量时,使用“&”符号。例如:
proc means data=file1; var ¯o_var.; run;
使用%MACRO和%MEND语句定义宏程序。例如:
%macro macro_print;
proc print data=file1 (obs=10); run;
%mend;
在代码中引用宏程序时,使用“%”符号。例如:
%macro_print;
宏变量在宏程序名后定义,宏程序中创建的变量是局部变量。例如:
%macro macro_means (var);
proc means data=file1; var &var run;
%mend;
在引用宏程序时,将宏变量传递给宏程序。例如:
%macro_means(risk_score);
%macro_means(risk_score_2);
宏变量在宏程序名后定义,并设置默认值。如果没有传递值,则使用默认值。例如:
%macro macro_means_def (var=risk_score);
proc means data=file1; var &var run;
%mend;
如果没有传递值,宏变量将使用默认值‘risk_score’。例如:
%macro_means_def();
%macro_means_def(var=risk_score_2);
SYSDATE是SAS被调用时的日期,SYSDATE9是SAS被调用时的日期格式为DDMMMYYYY,SYSDAY是SAS被调用时的一周中的哪一天,SYSTIME是SAS被调用时的时间。例如:
%put &sysdate
%put &sysdate9
%put &sysday
%put &systime
STR函数用于在编译期间屏蔽标记,以便宏处理器不将它们解释为宏级语法。特殊标记和助记符包括;+ – * / IN < LT LE > GT GE = EQ NE ~ NOT ^ AND | OR。例如:
%let var_means1 = %str(proc means data=file1; var risk_score; run;);
&var_means1;
程序员可以在宏变量之前立即放置文本,只要宏变量紧跟在“&”符号之后。例如:
%macro text_before (var);
proc means data=file1; var risk_score&var. run;
%mend;
%text_before();
%text_before(_2);
%text_before(_3);
引号是宏变量的一部分。例如:
%let var1 = "COVID-19";
%let var2 = 2020 as &var1 year;
%put &var2
宏处理器在双引号内解析宏变量引用,不在单引号内解析。例如:
%let var3 = HAPPY NEW YEAR;
%put "&var3";
%put '&var3';
CALL SYMPUT用于将数据集变量的值赋给宏变量。也可以在单个数据步骤中创建一系列宏变量。这个函数在用于给宏变量赋值时,会自动将数值转换为字符值。例如:
data _null_; call symput ('yyyy',2021); run;
%put &yyyy
程序员可以在proc sql的执行步骤中创建或更新宏变量。使用INTO子句定义宏变量。例如:
proc sql noprint; select avg(ext_quality_score) into: avg_score from file2; quit;
%put &avg_score;
使用INTO子句可以在proc sql步骤中创建多个宏变量。每个宏变量前都应有冒号(:)。例如:
proc sql noprint; select min(ext_quality_score), avg(ext_quality_score), max(ext_quality_score) into:min_score, :avg_score, :max_score from file2; quit;
%put &min_score;
%put &avg_score;
%put &max_score;
这些选项用于调试SAS宏。SYMBOLGEN在SAS日志中打印宏变量的值。MPRINT在宏执行时将文本发送到编译器,并在SAS日志中打印。MLOGIC打印在宏执行期间采取的宏操作的消息。例如:
options symbolgen mprint mlogic;
程序员需要按照宏变量定义的顺序定义宏变量的值。例如:
%macro macro_means_pos (d, v);
proc means data=&d var &v run;
%mend;
%macro_means_pos(file2, ext_quality_score);
程序员必须指定宏变量,后跟等号。宏变量的值的顺序可以是随机的。例如:
%macro macro_means_key (d=, v=);
proc means data=&d var &v run;
%mend;
%macro_means_key(d=file2, v=ext_quality_score);
%macro_means_key(v=ext_quality_score, d=file2);
%let a = 5;
%let b = 6;
%let c = %eval(&a+&b);
%put &c
%let a = 5.5;
%let b = 6.5;
%let c = %sysevalf(&a+&b);
%put &c