楼主: mkj_2009
6274 10

SAS 宏的问题 [推广有奖]

  • 4关注
  • 1粉丝

大专生

61%

还不是VIP/贵宾

-

威望
0
论坛币
43 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
106 点
帖子
45
精华
0
在线时间
38 小时
注册时间
2010-4-21
最后登录
2017-10-6

楼主
mkj_2009 发表于 2013-10-14 23:15:24 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位大神们,我现在遇见一个看似很简单却让我很头疼的问题。如下代码:
%macro test(type=);
%if &type=AR(1) %then %do;
  %let model=Yes;
%end;
%else %do;
  %let model=No;
%end;
%put &model;
%mend;
%test(type=AR(1));
其实很简单,我就是想用一个宏去输出模型的参数。
1)但是这个语句提示:ERROR: 需要的操作在以下的表达式中没有找到: &type=AR(1)
2)然后我想是不是因为含有括号的原因,于是我使用%str(AR(1)),但是效果一样。
3)接着我就用 %test(type=“AR(1)”),其中判断条件也换成了%if &type=“AR(1)” %then %do 接着没有报错但是没有put 任何信息,我再运行一次就出现如下错误:ERROR:条目锁定不可用与 TEST1.MACRO(目录 work.SASMACR)由DMS Process锁定/ 条目TEST1.MACRO 已经在目录 WORK.SASMACR中存在了。
4)迫于无奈我使用 %test(type=%str(“AR(1)”)),其中判断条件也换成了%if &type=%str(“AR(1)” ) %then %do
结果成功了,其实我不太理解为什么会是这样?

求高手按照我的序号1)-4) 解答。。。。。。。。十分感谢啊!!!


二维码

扫码加我 拉你入群

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

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

关键词:sasmacr Process Macro model Error 表达式 ERROR 模型

本帖被以下文库推荐

沙发
playmore 发表于 2013-10-15 09:29:36
折腾了半天没想法,等高人解释吧

另外,如果传参的时候把括号去掉的话就不会有这个问题了
所以简单的方法就是变通下算了,呵呵
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

藤椅
妖帝东皇 发表于 2013-10-15 10:56:43
  1. SAS宏中关于特殊字符的引用
  2. 在SAS宏中,字符串是用双引号括起来的,但如果字符串中要包含双引号或百分号等特殊字符就要使用单引号来对字符串中的特殊字符逃逸。比如:
  3.   %let test = ‘”A” is the first character !’;
  4.   但如果字符串中包含单引号,则上述方法便失效了。所以更一般的,SAS提供了%str和%nrstr来对特殊字符转义。其中%str可以转义逗号、单双引号、左右小括号、波浪号、分号、空格、尖角号等,而%nrstr除了可以转义%str能够转义的特殊符号,还可以转义与(&)符号和百分号。具体的使用方法如:
  5.   %let test=%str(“A” is the first character!);
  6.   需要注意的是,当使用%str时,如果引用的字符串包含有不匹配的单双引号,括号,必须使用百分号转义,如:
  7.   %let test=%str(I%’m consultant.);
  8.   当然,笔者为了怕出错误,%str中凡是遇到特殊字符都用百分号转义了,如:
  9.   %macro doit;
  10.   X “%str(copy %”a%” %”b%”)”;
  11.   %mend doit
  12.   最为特殊的符号是百分号本身,如果要在%str中包含百分号,同时又不让SAS将其及其后%的字符看成是宏名或宏调用,请用百分号对百分号进行转义,也就是用两个百分号来表示一个百分号,如:
  13.   %let test= %str(%“%%%” is a special character!);
  14.   测试一下:
  15.   data _null_;
  16.   put “&test”;
  17.   run;
  18.   Log窗口是不是打印出来”%” is a special character!字样了呢?
  19.   %str和%nrstr对常量是有效的,如果是变量的话,%str和%nrstr则不会对变量的内容进行转义。这种情况下,我们需要%bquote和%nrbquote,这两个statement则专门在宏扩展之后,宏执行的时候对变量对应的内容进行转义,比如:
  20. %let test=%str(%"%%sfsdf);
  21. %macro dd(h=);
  22. data _null_;
  23. %let a = %nrbquote(%substr(&h.,1,3));/*注意&h.点号*/
  24. put "&a.";
  25. run;
  26. %mend dd;
  27. %dd(h=&test);
  28. Log:
  29. "%s
复制代码

┏━━━━━━━━━━━━━━┓
   ☞❤学而无友必然孤陋寡闻!❤
┗━━━━━━━━━━━━━━┛

板凳
pobel 在职认证  发表于 2013-10-15 11:35:21
我认为出现ERROR的根源在于AR(1)中的左括号,如果让SAS把左括号当成一个普通的字符就应该不会有问题了。
%macro test(type=);
%if &type=AR%quote(()1) %then %do;
  %let model=Yes;
%end;
%else %do;
  %let model=No;
%end;
%put &model;
%mend;
%test(type=AR%quote(()1));

当然这里用%quote(AR(1))也没有问题,不过%str()是不可以的,因为%quote()是在宏执行的时候起作用,而%str()不是。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
playmore + 5 + 5 + 5 应该就是括号的问题,才知道%quote和%str在.

总评分: 学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

和谐拯救危机

报纸
mkj_2009 发表于 2013-10-30 10:25:08
pobel 发表于 2013-10-15 11:35
我认为出现ERROR的根源在于AR(1)中的左括号,如果让SAS把左括号当成一个普通的字符就应该不会有问题了。
% ...
太感谢学科带头人了噢

地板
mkj_2009 发表于 2013-10-30 10:35:58
pobel 发表于 2013-10-15 11:35
我认为出现ERROR的根源在于AR(1)中的左括号,如果让SAS把左括号当成一个普通的字符就应该不会有问题了。
% ...
因为%quote()是在宏执行的时候起作用,而%str()不是

这个是什么意思啊?说%str()在宏执行的时候就不起作用了?还是?比较困惑求解,谢谢!

7
pobel 在职认证  发表于 2013-10-30 12:23:44
mkj_2009 发表于 2013-10-30 10:35
因为%quote()是在宏执行的时候起作用,而%str()不是

这个是什么意思啊?说%str()在宏执行的时候就不起 ...
这是关于到宏的执行机制了,设计的内容比较细。建议您看一下帮助文档里的Understanding and Using Macro Facility中的Macro Processing和Macro Quoting两部分。

和谐拯救危机

8
275769263 发表于 2013-10-30 17:18:11
嘿嘿,参考http://blog.sina.com.cn/s/blog_8db50cf70101bez0.html
%macro test(type=);
%if %quote(&type.)=%quote(AR(1)) %then %do;
  %let model=Yes;
%end;
%else %do;
  %let model=No;
%end;
%put &model;
%mend;
%test(type=AR(1));
求工作..求工作..求工作..求工作...

9
mkj_2009 发表于 2013-11-18 09:41:01
pobel 发表于 2013-10-30 12:23
这是关于到宏的执行机制了,设计的内容比较细。建议您看一下帮助文档里的Understanding and Using Macro  ...
太感谢了。

10
mkj_2009 发表于 2013-11-18 09:41:28
275769263 发表于 2013-10-30 17:18
嘿嘿,参考http://blog.sina.com.cn/s/blog_8db50cf70101bez0.html
%macro test(type=);
%if %quote(&typ ...
多谢啦!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 08:19