楼主: dy21cn
1424 7

[问答] 关于宏调用的疑问,求大神指点 [推广有奖]

  • 1关注
  • 0粉丝

本科生

34%

还不是VIP/贵宾

-

威望
0
论坛币
25 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2005 点
帖子
62
精华
0
在线时间
69 小时
注册时间
2010-10-5
最后登录
2021-11-16

楼主
dy21cn 发表于 2013-9-8 22:44:09 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

宏部分如下:

%macro add_months(month, a);

       %local y m;

       %let y = %eval(&month / 100);

       %let m = %eval(&y * 12 + &month - &y * 100 - 1 + &a);

       %let y = %eval(&m / 12);

       %let m = %eval(&m - &y * 12 + 1);

       %local r;

       %if(&y < 10) %then %let r = 0%eval(&y * 100 + &m);

       %else %let r = %eval(&y * 100 + &m);

       &r.

%mend;


data test;
x=%add_months(201312,1);
run;

希望返回宏变量r的值, 即x=201401,
有以下疑问:
1、我的盗版sas没问题,但是在企业版上运行就报错。

2、单机版上&r.后面加“;”,会报错,为什么?

3、如果要返回多个值该如何处理,如返回r和m



二维码

扫码加我 拉你入群

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

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

关键词:months month Local Macro eval

沙发
dy21cn 发表于 2013-9-9 09:40:36
顺便说下,我用的是港版(企业版),好像很多语法和之前用的大陆版都有点微小的差异

藤椅
playmore 发表于 2013-9-9 10:43:04
这种具有返回值的macro,最后的返回值是不要加分号的
这种宏我用的很少,我都不太清楚具体的机理是什么
另外多个返回值肯定是不行的
其他的语言一般也不支持,要想返回多个值都要用返回向量来处理
SAS的话估计就更不行了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

板凳
dy21cn 发表于 2013-9-10 21:35:32
playmore 发表于 2013-9-9 10:43
这种具有返回值的macro,最后的返回值是不要加分号的
这种宏我用的很少,我都不太清楚具体的机理是什么
另 ...
多谢,
企业版报错是怎么回事呢?求解答

报纸
playmore 发表于 2013-9-11 08:16:39
dy21cn 发表于 2013-9-10 21:35
多谢,
企业版报错是怎么回事呢?求解答
嗯,对我等用D版的人来说
你的问题完全不明白啊
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

地板
Tigflanker 发表于 2013-9-11 16:09:23
2. &r.后面加“;” 肯定会报错的。“;”让SAS认为前面的是个完整的语句,则编译器会直接将&r.当做一条语句来解读了。 不加分号,&r. 就仅仅代表一个宏变量来进行解读,在外部宏环境继续被调用。

3. 多个返回值这个很诱惑喔,我建议你的宏可以定义一个require宏参数,来判断返回几个值;另外%macro add_months(month=, a=);是很好的选择,更加灵活。多返回值的话,建议用诸如&r.|&m.来进行结尾,最后对抛出的结果用%do %while(&mass. ne) 配合 %scan来截取一下。
Bye SAS.
若有缘,能重聚。

7
dy21cn 发表于 2013-9-12 12:39:09
Tigflanker 发表于 2013-9-11 16:09
2. &r.后面加“;” 肯定会报错的。“;”让SAS认为前面的是个完整的语句,则编译器会直接将&r.当做一条语句 ...
多谢

8
playmore 发表于 2013-9-13 10:27:30
Tigflanker 发表于 2013-9-11 16:09
2. &r.后面加“;” 肯定会报错的。“;”让SAS认为前面的是个完整的语句,则编译器会直接将&r.当做一条语句 ...
你给的方法,“建议用诸如&r.|&m.来进行结尾,最后对抛出的结果用%do %while(&mass. ne) 配合 %scan来截取一下”,应该还是只有一个返回值,只不过用|分隔了?

SAS不知道是否支持有多个返回值的函数,这点比R差多了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 10:44