关于本站
人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!
获取电子版《CDA一级教材》
完整电子版已上线CDA网校,累计已有10万+在读~ 教材严格按考试大纲编写,适合CDA考生备考,也适合业务及数据分析岗位的从业者提升自我。
TOP热门关键词
http://www.pinggu.org/bbs/thread-889793-1-1.html原程序在这里在这里提供了两个循环调用宏的方法,一个是用另外一个宏循环调用外部的已经编写好的宏另外一个是在data步里面调用宏。%macroouter;%doi=1%to10;%inner ...
免费学术公开课,扫码加入![]() |
原程序在这里
在这里提供了两个循环调用宏的方法,一个是用另外一个宏循环调用外部的已经编写好的宏 另外一个是在data步里面调用宏。
%macro outer;
%do i=1 %to 10;
%inner2(0, 1, &i);
%end;
%mend;
%outer
这个是第一个方法,其实这个方法我最熟悉也经常用的一个方法,封装在另外一个宏循环里面,结构清晰,不容易出错。
其实在这里给我们写程序提供了一个思路,对于一个比较复杂的程序来说,我们要学会功能分解,结构化的去设计程序。例如在这个程序里面,
我们讲重复需要实现的过程或者步骤写成一个宏程序,设置好宏参数。解决一个比较复杂问题的时候,将问题分解成若干个小问题,对于每一个问题或者每一个功能写成一个宏模块,但是一定要设计好参数,这个参数是与其他结构模块相互沟通的接口。就想现在建房子一样,都是组合式,每一个部门都是标准化设计,然后组合在一起实现一个整体的需要或者整体的功能。
hopewell的程序里面提供一个宏宇data步交互的方法
- %macro inner(x,y,z);
- %put NOTE:*** Macro inner: x=&x y=&y z=&z ***;
- %mend inner;
- data _null_;
- do i=1 to 3;
- call execute(cats('%inner(0,1,',put(i,best.),')'));
- /* %inner(0,1,i);*/
- end;
- run;
其实这句话里面cats连接字符函数,最后得出的结果其实就是call execute('%inner(0,1,i)')
但是在这里如果直接写call execute('%inner(0,1,i)')岂不是更简洁?
如果说是没有参数,call execute('%inner') 这样是可以的,但是如果是参数,就注意,如果写成call execute('%inner(0,1,i)'),他会解析成一个宏调用,%inner(0,1,i),同时DATA步停止,而不是我们想的%inner(0,1,1)这样,因此要想得到%inner(0,1,1)这样解析结果,就要对I进行一个处理,把%inner(0,1,1)看做一个字符串,对于这个字符串变化的那个需要用put函数将其转换一个字符,用cats来连接。
至于call execute的使用方法:可以看看下面一个我转载的帖子
[功能]
解析参数,如果解析后的值是sas语句(sas statement),则在下一个步边界(step boundary)执行;
如果此值为macro语言元素(macro language element),则立即执行.
用于在data step中与macro机制进行交互.
[分类]
宏(macro)
[语法]
CALL EXECUTE(argument);
[参数]
argument
指定一个产生宏调用或者sas语句的字符表达式或者常量.argument可以是:
一个字符串,放入引号内
data步的字符变量,不要使用引号括住
一个字符表达式,数据步解析成宏文本表达式(macro text expression)或者sas语句.
[详细]
如果参数被解析成一个宏调用,则宏立刻运行,在这个宏执行时,data步的执行暂停.
如果参数被解释成一个sas语句,或者宏的执行产生sas语句,这些语句在call execute
子程序的所在的data步结束后才执行.
[CALL EXECUTE子程序同步(timing)详解]
当想有条件的执行macro时,CALL EXECUTE很有用.但牢记,如果call execute产生macro language elements,
则他们立即执行;如果call execute产生sas language statements,或者macro language elements产生
sas language statements,这些statements在当前data step执行后执行.
下面两个例子阐述用户使用call execute常有的问题
例1:
data prices;/* ID for price category and actual price */
input code amount;
cards;
56 300
99 10000
24 225
;
%macro items;
%global special;
%let special=football;
%mend items;
data sales;/* incorrect usage */
set prices;
length saleitem $ 20;
call execute('%items');
saleitem=”&special”;
run;
在DATA SALES step中,在data步编译时,对SALEITEM的赋值需要macro变量SPECIAL的值.
但是直到data step执行时,call execute才产生这个值.所以,在log中能看一个
未解析宏变量的消息,并且SALEITEM的值为&special.
在这个例子中,去掉宏定义或者把DATA SALES步放到宏ITEMS中更好.在这两种情况下,
call execute都不必要,也没什么用处.下面是此程序正确的一个版本
data prices;/* ID for price category and actual price */
input code amount;
cards;
56 300
99 10000
24 225
;
%let special=football;/* correct usage */
data sales;
set prices;
length saleitem $ 20;
saleitem=”&special”;
run;
例2:
/* This version of the example shows the problem.*/
data prices;/* ID for price category and actual price */
input code amount;
cards;
56 300
99 10000
24 225
;
data names;/* name of sales department and item sold */
input dept $ item $;
cards;
BB Boat
SK Skates
;
%macro items(codevar=);/* create macro variable if needed */
%global special;
data _null_;
set names;
if &codevar=99 and dept='BB'then call symput('special',item);
run;
%mend items;
data sales;/* attempt to reference macro variable fails */
set prices;
length saleitem $ 20;
500 then
call execute('%items(codevar='|| code || ')');
saleitem=”&special”;
run;
在这个例子中,宏ITEMS生成一个DATA _NULL_ step,这个step在DATA SALES step执行之后
才执行.而在DATA SALES编译时就需要DATA _NULL_ step中创建的SPECIAL.
正确的一个例子:
/* This version solves the problem.*/
data prices;/* ID for price category and actual price */
input code amount;
cards;
56 300
99 10000
24 225
;
data names;/* name of sales department and item sold */
input dept $ item $;
cards;
BB Boat
SK Ski
;
%macro items(codevar=);/* create macro variable if needed */
%global special;
data _null_;
set names;
if &codevar=99 and dept='BB'then
call symput('special',item);
run;
%mend items;
data _null_;/* call the macro in this step */
set prices;
500 then
call execute('%items(codevar='|| code || ')');
run;
data sales;/* use the value created by the macro in this step */
set prices;
length saleitem $ 20;
saleitem=”&special”;
run;
上面的例子使用一个DATA _NULL_ step来调用宏ITEMS.在这个step结束后,由ITEMS产生的
DATA _NULL_ step执行,并创建宏变量SPECIAL.
「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
您可能感兴趣的文章
人气文章
本文标题:跟crackman读SAS程序(4)
本文链接网址:https://bbs.pinggu.org/jg/ruanjianpeixun_sasruanjianpeixun_889979_1.html
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。



