全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4541 17
2013-02-20
各位大侠,我又来提问了:写了一个宏,用来出城市月报的%macro report(city=)
...&city...
%mend

虽然执行起来我可以
%report(city='北京');
%report(city='上海');
%report(city='广州');
但是有221个城市之多……

于是建了一个citylist,希望把'城市'取出来带入宏参数然后循环执行,未果——
proc iml;
do i=1 to 221;
use citylist;
read all var{name} into x1 where(id=i);
end;
%report(city=x1);
quit;


简单提示一下就行,多谢!年后一直在看R,现在思路非常凌乱……
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-2-20 15:47:28
data a;
input  city $;
cards;
上海
北京
;
run;

%macro report(city=);
data _null_;
put "&city.很脏";
run;
%mend;


data b;
set a;
call execute(%nrstr("%report%(city=")!!city!!%str(")"));
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-2-20 15:50:51
方案二:
data a;
input  city $;
cards;
上海
北京
;
run;

proc sql;
select city into :city1-:city2 from a;
quit;
%macro xunhuan;
%do i=1 %to 2;
%report(city=&&city&i);
%end;
%mend;
%xunhuan
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-2-21 18:05:30
Imasasor 发表于 2013-2-20 15:47
data a;
input  city $;
cards;
经过两天的冥思苦想,我终于能够解读这段代码了,不对之处请指正!多谢指教了!

call execute用于在data step调用宏,
原则是,除了data步涉及的变量之外的内容都需要用引号,且是宏专用的引号。
这里实际上是
call execute要引用一段内容,这内容是 %report(city=city),其中第二个city是变量,其他都是需要加引号的
SAS连接变量和文本可以用!!和||,文本!!变量!!文本,于是可以这样写:
"%report(city="  !!  city  !!  ")"
而宏引用需要特定的写法,不能直接用“”,要用到%nrstr和%str,一个包括%和&,一个不包括,
再变身就成了 %nrstr("文本")!!变量!!%str("文本"),也就是
%nrstr("%report(city=")!!city!!%str(")")
最后,套上外皮
call execute(%nrstr("%report%(city=")!!city!!%str(")"));

真够闹心的啊……接下来再研究下一段代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-2-21 22:16:06
Imasasor 发表于 2013-2-20 15:50
方案二:
data a;
input  city $;
嘿嘿 得到你这么妙的亲传我岂能不认真研读啊~
解读的清晰一点也为后来人提供便利嘛

第二段代码涉及到两方面内容
1是PROC SQL产生宏变量的问题——
2是宏嵌套的问题——

感觉还不能很好的理解,
更感觉SAS根深叶茂的实在超乎我的想象了。。。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-2-21 22:18:34
complicated 发表于 2013-2-21 22:16
嘿嘿 得到你这么妙的亲传我岂能不认真研读啊~
解读的清晰一点也为后来人提供便利嘛
好好学习,看你头像也是个数据爱好者
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群