楼主: kofsphere
1423 5

[问答] SAS macro 执行的疑问,是coding“打开方式”不对还是compiler不靠谱? [推广有奖]

  • 0关注
  • 0粉丝

本科生

66%

还不是VIP/贵宾

-

威望
0
论坛币
1351 个
通用积分
0.1990
学术水平
2 点
热心指数
1 点
信用等级
1 点
经验
1284 点
帖子
103
精华
0
在线时间
91 小时
注册时间
2005-6-1
最后登录
2024-3-7

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我用sas base 写code很长时间了,一直以来有个疑问:

曾经在写比较复杂的code的时候,特别是迭代层数比较多的code,譬如中间穿插了很多外部的code文件,经常会遇到code执行不了的情况,
详细检查发现code没有任何问题,但sas总是报错,不是找不到某个file就是无法定义一些变量,而单独选定提交相应的code(而非整个code)就完全可以执行,
或者只要改写coding的方式,减少迭代,甚至是按submit的那个键的力度不同,code都可以正确执行,但这样却降低了效率

我试想是不是sas base这个compilier比较弱,一旦code比较负责就容易出问题?不知大家有没有遇到过,都怎样解决的?
二维码

扫码加我 拉你入群

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

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

关键词:COMPILE Coding Macro DING comp 无法定义 file 力度

沙发
shaode01 学生认证  发表于 2015-8-27 00:33:59 来自手机 |只看作者 |坛友微信交流群
kofsphere 发表于 2015-8-26 21:16
我用sas base 写code很长时间了,一直以来有个疑问:

曾经在写比较复杂的code的时候,特别是迭代层数比较 ...
请举个例子

使用道具

藤椅
pobel 在职认证  发表于 2015-8-27 08:51:48 |只看作者 |坛友微信交流群
“按submit键力度不同,会影响code的执行”? SAS应该没那么大脾气。
具体原因应该还是在代码里,比如很多外部code文件的执行顺序会不会影响执行结果?

使用道具

板凳
Tigflanker 发表于 2015-8-27 13:26:15 |只看作者 |坛友微信交流群
我以为是我打开这个贴的方式不对,

直到我看到了:按submit键力度不同..

兄台再运行几段程序可以和SAS无障碍对话了

code比较复杂,多次循环,可以考虑是否某次循环某个数据集本身没有生成,但是拿上一次循环留下来的数据集直接调用了。

编译出错,干脆把里面全部注释手动删除看一下运行效果。

使用道具

报纸
kofsphere 发表于 2015-8-30 07:17:00 |只看作者 |坛友微信交流群
那么举个例子,请大家看这个例子
下面是code

* code A ;
* ignore detailed logs ;
options nosource nonotes pagesize= max ;
* output 'warnings' in the log to an external file ;
*proc printto log='H:\SAS output log\SAS_log';
run;

*proc printto  ; run;

* load external macros ;
%include 'H:\External macros\code x count rows and columns.sas' ;run ;

* define the category we want to model and its library  ;
%let raw_data = data5.Data_factor ;
%let category = king ;

* define intermediate libraries which stores the retained variables by the two-stage vsm ;
%let dest_lib1= data_var ;
%let dest_lib2= data_v2 ;

* input the number of rolling events ;
%let experiment= 1 ;  
%put &experiment &raw_data &category ;
上面的code调用了一个外部的文件,叫做code x count rows and columns.sas,这个外部的macro function是用来找出一个data table里面的行数和列数的(非常有用,如果大家觉得有价值可以收藏),里面包含:


%macro obsnvars(ds);
%global dset nvars nobs;
%let dset=&ds;

/* Open data set passed as the macro parameter */
%let dsid = %sysfunc(open(&dset));

/* If the data set exists, then grab the number of observations and variables */
/* then close the data set                                                    */
%if &dsid %then
   %do;
      %let nobs =%sysfunc(attrn(&dsid,nobs));
      %let nvars=%sysfunc(attrn(&dsid,nvars));
      %let rc = %sysfunc(close(&dsid));
   %end;

/* Otherwise, write a message that the data set could not be opened */
%else %put open for data set &dset failed - %sysfunc(sysmsg());
%mend obsnvars;


/* Execute the macro -- pass TEST as the data set parameter

%obsnvars(test)
* /
* %put &dset has &nvars variable(s) and &nobs observation(s).;


现在的问题是,code A是无法运行的, 然而只要不调用这个外部文件就可以运行
请各位用自己的系统试试看

使用道具

地板
kofsphere 发表于 2015-8-30 07:45:40 |只看作者 |坛友微信交流群
终于找到问题所在!
解决了长久以来困扰我的问题!

在一个macro里面,注释语句一定要用/*   xxx  */ 而不是 * xxx  ; 后者无法将macro内部的%识别为comment

最后,谢谢大家!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 06:14