12. SAS宏简介

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

%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(),获取当前日期
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;
%end; %mend;
/*调用宏*/ %test2
Slide 24
2) 条件判断语句
格式: %If 表达式 %THEN 语句1; % ELSE 语句2;
或复合语句 %If 表达式 %THEN %DO; 语句组; %END; % ELSΒιβλιοθήκη Baidu %DO; 语句组; %END;
Slide 25
例子,根据输入选择性输出
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 20
例子,宏DO循环
%macro test; %do i=1 %to 5; %put this is a test for DO: %end; %mend; /*调用*/ %test
LOG窗口输出结果: this is a test for this is a test for this is a test for this is a test for this is a test for
Slide 22
1) 宏do循环语句
直到型循环 %Do %Until(表达式); 循环体; %End; 当型循环 %Do %While(表达式); 循环体; %End; 注:当型循环和直到型循环需自己设置一个宏变量作为 循环变量,对循环变量累加赋值时需使用函数%eval( )来 计算算术表达式的值
Slide 14
宏的调用
调用宏的格式,使用%
%宏名称
例如,调用上面建立的宏myprint
%myprint 其作用就是执行下面SAS程序 proc print; run;
Slide 15
4. 宏参数
定义: %macro 宏名称(参数1,参数2,….); 宏文本 %mend;
说明:其中参数列是逗号分开的参数名,参数列中提到 的参数在宏文本中作为宏变量引用
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;
%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)
%let data1=x; %let data2=y; %let data3=z; %let i=1; %put &&data&i; /*&data&i不能用*/ %let i=2; %put &&data&i; /*&data&i不能用*/
Slide 12
3. 宏
概念:
宏是被存储的文本,用一个名字识别它,可以从 SAS程序中调用执行
title "我的标题:This is my first macro variable"; proc print data = SASHELP.CLASS; run;
实质上,SAS在运行时,将宏变量的值替代到了 相应的位置上 即,&hello换成了This is my first macro variable &DSN换成了SASHELP.CLASS
title1 “&hello.1 第一个程序”;
title2 “&hello.2 第二个程序”;
Slide 11
5) 间接引用宏变量
“&宏变量名”来引用宏的方式是直接引用 如果引用的宏变量名是通过宏产生的,则需要间接引用, 此时需要用:&& 例如,有三个宏变量:data1,data2, data3,只是末尾数字不 同。采用下列方式引用时,需用间接引用方式。
SAS宏简介
Slide 1
主要内容:
1.概述 2.宏变量
3.宏
4.宏参数 5.宏内流程控制结构 6.宏与数据步的信息交换 7.宏语句与宏函数
Slide 2
1.概述
SAS宏工具是SAS系统的重要编程工具,功能强大 可以给一个变量、一段程序、一段文本命名,供以后调用 是编制用户化的SAS系统的重要工具 使用宏工具来完成以下任务:
宏的定义 %macro 宏名称; 宏文本 %mend <宏名称>;
/*表示宏定义的开始*/
/*宏的主体部分*/
/*宏定义的结束*/
Slide 13
例子,宏的定义
%macro myprint; proc print data=&syslast; run; %mend;
上面例子定义一个宏:myprint,其功能为打印最近建立的 SAS数据集;宏定义语句提交运行后,SAS只是编译这段程 序,如果有错,则会在log窗口提示;如果没有错误,则将 编辑之后的宏存储到work.sasmacr目录中(默认),但不会 执行宏 &SYSLAST 表示系统最近生成的一个数据集
例子,
%let mynum=36; data a; input x@@; call symput('px',x); y=symget('mynum'); cards; 1234 ; run;
创建宏变量mynum,取值为36 在数据步中,通过symget()函数获取宏变量的值,赋给变量Y 在数据步中,通过symput()子过程创建宏变量px,将变量x的值 赋给宏变量
%put _user_; %put _automatic_; %put _all_; 显示用户定义的宏变量 显示系统提供的自动宏变量 显示所有宏变量
显示指定宏变量的值 %put &宏变量名;
例如
%put &hello; %put &dsn; %put this is my test: &dsn;
Slide 17
关键字参数的定义与调用
在命名和调用时用等号(=)指定参数名称的参数为 关键字参数,此时可以给参数赋初值
/*定义*/ %macro myprint(dataset=&syslast,varlist=_numeric_); proc print data=&dataset; var &varlist; run; %mend; /*引用,指定参数*/ %myprint(datasex=sashelp.class,varlist=name sex)
data _null_; t=symget('Total'); do i=1 to t; k+i; end; call symput('Ntotal',k); run; %put Ntotal= &Ntotal;
Slide 29
宏函数

宏功能包括很多宏程序语句和宏函数, 下面列出几个
函数名 %Eval 说明 计算算术和逻辑表达式 整数格式
Slide 8
定义宏变量的值为一段程序 格式:
%let 宏变量名 = %str(一段程序);
例如 %let prt = %str( PROC PRINT; RUN; ); 引用 &prt 产生的作用: PROC PRINT; RUN;
Slide 9
3) 显示宏变量及宏变量的值: %put
显示宏变量
%let k = 1;
Slide 5
2)引用宏变量
引用宏变量的方式:在宏变量名前使用&
&宏变量名
例如,
title "我的标题:&hello"; proc print data = &DSN; run;
注意:只有在双引号中,宏变量才能被引用; 单引号不会引用!
Slide 6
等价的SAS数据步程序
执行重复性任务
使用宏变量实现文本替代 使用宏产生程序语句
使用宏循环及条件判断语句完成程序交互
Slide 3
2. 宏变量
宏变量是SAS宏语言中用于存储一段字符串的SAS命名
宏变量的主要用途是进行SAS文本替代 SAS宏变量分类
用户定义宏变量 用户根据自己需要定义的宏变量
引用: %宏名称(参数1,参数2,….)
说明:每个参数值将赋予宏定义中相应位置的参数。
Slide 16
例如,宏参数的定义与调用
/*定义*/ %macro myprint(dataset,varlist); proc print data=&dataset; var &varlist; run; %mend; /*引用,指定参数*/ %myprint(sashelp.class,name sex) 说明:参数与参数之间以逗号分隔,引用时,第二个 参数varlist的值为:name sex。
说明:引用时,关键字参数不受位置的限制。 该宏默认时打印最后建立的数据集中的所有数值型变量
Slide 18
5. 宏内流程控制结构
宏do循环语句 条件判断语句
Slide 19
1) 宏DO循环语句
计数型循环:
%Do 循环变量 = 初值 %to 终值 [%By 步长]; 循环体; %End; 注:循环变量是一个宏变量 需要在宏定义的内部使用
Slide 26
6. 宏与数据步的信息交换
常用的两个子程序或函数
子程序 SYMPUT子程序 说明 在数据步中,将变量的值传给宏变量 使用语法: Call symput(‘宏变量名’,变量名); 在数据步中,获取宏变量的值 使用语法: Y=symget(‘宏变量名’);
SYMGET函数
Slide 27
自动宏变量:
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的值
Slide 10
4) 宏变量与后续文本的分隔
当宏变量跟后续文本紧密同时使用时,需要界定宏变量的 结束位置
例如
title1 “&hello1 第一个程序”;
title2 “&hello2 第二个程序”; 此时,SAS会认为宏变量名为hello1和hello2,而实际上宏 变量为hello 解决办法:在宏变量结束的地方加一个英文句号(.),如下
相关文档
最新文档