l*********t 发帖数: 18 | 1 我写了一个很短的macro, 用来提取sas dataset的attribute.
%macro getattrn(indata=, attrn=);
%if %sysfunc(exist(&indata)) %then %do;
%* open data set;
%let did=%sysfunc(open(&indata));
%* Get attribute;
%let attvalue=%sysfunc(attrn(&did, &attrn));
%* Close data set;
%sysfunc(close(&did));
%end;
%else %let attvalue=-999;
&attvalue
%mend getattrn;
然后call的时候就把值赋给一个marco variable, 比如
%let MV=%getattrn(indata=mydata, attrn=nobs)
按道理这个macro应该返回mydata里面的observation个数. 但是我查MV的值竟然是:
0; 396
mydata的确有396个observation, 但是我不知道前面的0;是从哪儿产生的.
谁能帮我看一下吗?
谢谢先 |
A*******s 发帖数: 3942 | 2 我一时半刻看不出来这个0怎么来
但是你是不能这么用macro的
macro不是函数,没有返回值,只是文本替换而已。
【在 l*********t 的大作中提到】 : 我写了一个很短的macro, 用来提取sas dataset的attribute. : %macro getattrn(indata=, attrn=); : %if %sysfunc(exist(&indata)) %then %do; : %* open data set; : %let did=%sysfunc(open(&indata)); : %* Get attribute; : %let attvalue=%sysfunc(attrn(&did, &attrn)); : %* Close data set; : %sysfunc(close(&did)); : %end;
|
k*******a 发帖数: 772 | 3 我觉得是 %sysfunc(close(&did)); 这一句引起的
因为他返回0 ,如果改成 %let close=%sysfunc(close(&did)); 应该就好了 |
A*******s 发帖数: 3942 | 4 你说的应该是对的。
不过编程还是尽量少选高难度模式吧,呵呵
【在 k*******a 的大作中提到】 : 我觉得是 %sysfunc(close(&did)); 这一句引起的 : 因为他返回0 ,如果改成 %let close=%sysfunc(close(&did)); 应该就好了
|
l*********t 发帖数: 18 | 5 非常感谢! 你好厉害, 一下就看出来了!
【在 k*******a 的大作中提到】 : 我觉得是 %sysfunc(close(&did)); 这一句引起的 : 因为他返回0 ,如果改成 %let close=%sysfunc(close(&did)); 应该就好了
|
l*********t 发帖数: 18 | 6 sas是可以这样返回值的, 不过我承认的确很不方便.
如果不这样返回的话, 就只能用global variable. 我个人不喜欢用太多global macro
variable. 用多了程序结构很乱.
其实sas的macro做得就跟一坨屎一样, 我经常想写信骂他们.
【在 A*******s 的大作中提到】 : 你说的应该是对的。 : 不过编程还是尽量少选高难度模式吧,呵呵
|
A*******s 发帖数: 3942 | 7 很多语言的macro都是一样的吧,
macro肯定没有function这么方便啊
而且你这个最后还是赋值给一个global macro variable了
你把这个赋值语句放进你的macro里面再设为global也是一样的吧。
macro
【在 l*********t 的大作中提到】 : sas是可以这样返回值的, 不过我承认的确很不方便. : 如果不这样返回的话, 就只能用global variable. 我个人不喜欢用太多global macro : variable. 用多了程序结构很乱. : 其实sas的macro做得就跟一坨屎一样, 我经常想写信骂他们.
|
l*********t 发帖数: 18 | 8 我赋值给的是local variable啊
【在 A*******s 的大作中提到】 : 很多语言的macro都是一样的吧, : macro肯定没有function这么方便啊 : 而且你这个最后还是赋值给一个global macro variable了 : 你把这个赋值语句放进你的macro里面再设为global也是一样的吧。 : : macro
|