当前位置:文档之家› 12. SAS宏简介

12. SAS宏简介

data _null_; t=symget('Total'); do i=1 to t; k+i; end; call symput('Ntotal',k); run; %put Ntotal= &Ntotal;
Slide 29
宏函数

宏功能包括很多宏程序语句和宏函数, 下面列出几个
函数名 %Eval 说明 计算算术和逻辑表达式 整数格式
%put _user_; %put _automatic_; %put _all_; 显示用户定义的宏变量 显示系统提供的自动宏变量 显示所有宏变量
显示指定宏变量的值 %put &宏变量名;
例如
%put &hello; %put &dsn; %put this is my test: &dsn;
%end; %mend;
/*调用宏*/ %test2
Slide 24
2) 条件判断语句
格式: %If 表达式 %THEN 语句1; % ELSE 语句2;
或复合语句 %If 表达式 %THEN %DO; 语句组; %END; % ELSE %DO; 语句组; %END;
Slide 25
例子,根据输入选择性输出
引用: %宏名称(参数1,参数2,….)
说明:每个参数值将赋予宏定义中相应位置的参数。
Slide 16
例如,宏参数的定义与调用
/*定义*/ %macro myprint(dataset,varlist); proc print data=&dataset; var &varlist; run; %mend; /*引用,指定参数*/ %myprint(sashelp.class,name sex) 说明:参数与参数之间以逗号分隔,引用时,第二个 参数varlist的值为:name sex。
%SYSEVAL 计算算术和逻辑表达式 浮点格式 F %SYSFUNC 调用数据步函数,功能强大 %SYSFUNC(数据步函数(参数),<输出格式>)
Slide 30
例如,宏变量计算
%let x=100; %let y=%eval(&x+200); %let z=&x+200; %put y=&y z=&z; %put %sysevalf(&x+12.35); %put %sysfunc(today(),mmddyy10.); Log窗口显示的结果为: y=300 z=100+200 112.35 11-25-2015 浮点计算需要用%sysevalf函数 %sysfunc函数调用数据步函数today(),获取当前日期
title "我的标题:This is my first macro variable"; proc print data = SASHELP.CLASS; run;
实质上,SAS在运行时,将宏变量的值替代到了 相应的位置上 即,&hello换成了This is my first macro variable &DSN换成了SASHELP.CLASS
自动宏变量:
SAS系统提供的可以引用的宏变量
Slide 4
1) 自定义宏变量
自定义宏变量格式,使用%let语句
%LET 宏变量名 = 宏变量值;
例如: %let hello = This is my first macro variable;
%let DSN = SASHELP.CLASS;
Slide 28
例子,将数据集观测总数赋给宏变量Total
data _null_; set sashelp.class nobs=i; call symput('Total',i); run;
用数据步计算1到Total之间的自然数之和,赋给宏变量 Ntotal,用%put语句显示宏变量Ntotal的值
%macro test3(Res=Y); %if &Res=Y %then %put Yes, you are right!; %else %put No, you are wrong!; %mend; %test3(res=n) %macro test4(Num=Y,dsn=sashelp.class); proc print data=&dsn; %if &Num=Y %then %do; var _numeric_; 根据Num的值判断输出 %end; Y:输出全部数值变量 %else %do; 其它,输出所有变量 var _all_; %end; run; %mend; %test4(Num=Y)
Slide 10
4) 宏变量与后续文本的分隔
当宏变量跟后续文本紧密同时使用时,需要界定宏变量的 结束位置
例如
title1 “&hello1 第一个程序”;
title2 “&hello2 第二个程序”; 此时,SAS会认为宏变量名为hello1和hello2,而实际上宏 变量为hello 解决办法:在宏变量结束的地方加一个英文句号(.),如下
Slide 22
1) 宏do循环语句
直到型循环 %Do %Until(表达式); 循环体; %End; 当型循环 %Do %While(表达式); 循环体; %End; 注:当型循环和直到型循环需自己设置一个宏变量作为 循环变量,对循环变量累加赋值时需使用函数%eval( )来 计算算术表达式的值
Slide 26
6. 宏与数据步的信息交换
常用的两个子程序或函数
子程序 SYMPUT子程序 说明 在数据步中,将变量的值传给宏变量 使用语法: Call symput(‘宏变量名’,变量名); 在数据步中,获取宏变量的值 使用语法: Y=symget(‘宏变量名’);
SYMGET函数
Slide 27
SAS宏简介
Slide 1
主要内容:
1.概述 2.宏变量
3.宏
4.宏参数 5.宏内流程控制结构 6.宏与数据步的信息交换 7.宏语句与宏函数
Slide 2
1.概述
SAS宏工具是SAS系统的重要编程工具,功能强大 可以给一个变量、一段程序、一段文本命名,供以后调用 是编制用户化的SAS系统的重要工具 使用宏工具来完成以下任务:
DO: DO: DO: DO: DO: 1 2 3 4 5
Slide 21
&i;
生成重复文本
%macro dsn(name, num); %do i=1 %to &num; &name&i %end; %mend;
在DATA语句中调用宏dsn: data %dsn(AB, 5); run;
产生下列data步语句: DATA AB1 AB2 AB3 AB4 AB5;
%let k = 1;
Slide 5
2)引用宏变量
引用宏变量的方式:在宏变量名前使用&
&宏变量名
例如,
title "我的标题:&hello"; proc print data = &DSN; run;
注意:只有在双引号中,宏变量才能被引用; 单引号不会引用!
Slide 6
等价的SAS数据步程序
title1 “&hello.1 第一个程序”;
title2 “&hello.2 第二个程序”;
Slide 11
5) 间接引用宏变量
“&宏变量名”来引用宏的方式是直接引用 如果引用的宏变量名是通过宏产生的,则需要间接引用, 此时需要用:&& 例如,有三个宏变量:data1,data2, data3,只是末尾数字不 同。采用下列方式引用时,需用间接引用方式。
例子,
%let mynum=36; data a; input x@@; call symput('px',x); y=symget('mynum'); cards; 1234 ; run;
创建宏变量mynum,取值为36 在数据步中,通过symget()函数获取宏变量的值,赋给变量Y 在数据步中,通过symput()子过程创建宏变量px,将变量x的值 赋给宏变量
Slide 7
多次引用宏变量
title "我的标题:&HELLO"; title2 "打印的数据集是&DSN"; PROC PRINT DATA = &DSN; RUN;; DATA A; SET &DSN; IF SEX="M"; RUN; 三次引用宏变量DSN
PROC PRINT DATA=A; RUN;
Slide 14
宏的调用
调用宏的格式,使用%
%宏名称
例如,调用上面建立的宏myprint
%myprint 其作用就是执行下面SAS程序 proc p: %macro 宏名称(参数1,参数2,….); 宏文本 %mend;
说明:其中参数列是逗号分开的参数名,参数列中提到 的参数在宏文本中作为宏变量引用
Slide 23
例子,%DO %WHILE
%macro test2; %let i=1; %do %while(&i<10); %put this is a test for DO WHILE: &i; %let i=%eval(&i+1);
/*函数%eval()将整数值宏文本转换成数值进行算术运算*/ /*函数%sysevalf()将带小数的文本转换成数值进行算术运算*/
Slide 17
关键字参数的定义与调用
相关主题