SAS中文论坛

标题: 求教:宏里面怎么使用数组的维数? [打印本页]

作者: shiyiming    时间: 2010-2-2 22:16
标题: 求教:宏里面怎么使用数组的维数?
%macro aaaa();
data a;
array new{4} score1-score4;
%do i=1 %to dim(new) %by 1;
   new{i}=10;
%end;

proc print data=a;
run;
%mend aaaa;
%aaaa();

输出错误:
MPRINT(AAAA):   array new{4} score1-score4;
[color=#FF0000:a1essc2e][color=#FF0000]ERROR: Required operator not found in expression: dim(new)
ERROR: The %TO value of the %DO I loop is invalid.
ERROR: The macro AAAA will stop executing.[/color:a1essc2e][/color]
作者: shiyiming    时间: 2010-2-2 22:27
标题: Re: 求教:宏里面怎么使用数组的维数?
建议把%do loop的%去掉,按上下文来看这只是一个base language下的do loop
%do i=1 %to dim(new) %by 1;
new{i}=10;
%end;
作者: shiyiming    时间: 2010-2-2 22:37
标题: Re: 求教:宏里面怎么使用数组的维数?
这不是原始问题,这是原始问题的简化版本,dim函数必须在一个宏里面使用,那应该怎么做呢?
作者: shiyiming    时间: 2010-2-3 08:30
标题: Re: 求教:宏里面怎么使用数组的维数?
建议不要用数组了。直接使用宏变量序列,然后计算得出宏变量个数之后,再进行宏循环。例如下例,注意这也只是个解决方案的例子,希望对你有帮助。
[code:16mwj2o8]data raw(drop=i);
        do i=1 to 5;
                score1=1;
                score2=2;
                score3=3;
                score4=4;
                output;
        end;
run;

%macro example;

proc contents data=raw out=raw_var noprint;
run;
proc sort data=raw_var;
by varnum;
run;

data _NULL_;
        set raw_var end=eof;
        call symput('var'||trim(left(put(_N_,best.))),trim(left(name)));
        if eof then call symput('varno',trim(left(put(_N_,best.))));
run;
%put &&var&varno;

data tmp;
        set raw;
        %do j=1 %to &varno;
                &&var&j=10;
        %end;
        output;
run;
       
%mend example;

%example
[/code:16mwj2o8]
作者: shiyiming    时间: 2010-2-3 10:02
标题: Re: 求教:宏里面怎么使用数组的维数?
不了解你的应用,但是如果能写score1-score4,是不是可以考虑把4做为宏参数
[code:k4obl111]%macro aaaa(array_n);
        data a;
                array new{*} score1-score&array_n;
                %do i=1 %to &array_n %by 1;
                        new{&i}=10;
                %end;
        run;

        proc print data=a;
        run;
%mend aaaa;

%aaaa(4);[/code:k4obl111]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2