Macros 是否可以将宏传递到宏中?
在SAS中,我可以使用这个方便的代码片段来执行类似的操作Macros 是否可以将宏传递到宏中?,macros,sas,code-readability,Macros,Sas,Code Readability,在SAS中,我可以使用这个方便的代码片段来执行类似的操作 %let listofvars = work.apples work.bananas work.oranges; %let var_no = 1; %let var = %scan(&listofvars, &var_no, ' '); %do %while (&var ne); proc sort data = &var; by id; run; %let
%let listofvars = work.apples work.bananas work.oranges;
%let var_no = 1;
%let var = %scan(&listofvars, &var_no, ' ');
%do %while (&var ne);
proc sort data = &var;
by id;
run;
%let var_no = %eval(&var_no +1);
%let var = %scan(&listofvars, &var_no, ' ');
%end;
对每个数据集进行排序
我很想将代码段简化为循环宏,这样我就可以执行以下操作:
%let setlist = work.apples work.bananas work.oranges;
%macro mymacro(dataset);
proc sort data = &dataset.
by id;
run;
%mend;
%loop(&setlist, mymacro);
/*the loop macro will know to pass the &var. in as a arguement to the macro*/
这将提高代码的可读性
这可能吗?是的。名称宏例程可以是宏。宏为您“编写”SAS代码
%macro create(dataset);
data &dataset;
do i=1 to 10;
id=rannor(0);
output;
end;
run;
%mend;
%macro sort(dataset);
proc sort data=&dataset;
by id;
run;
%mend;
%macro loop(list,mcr);
%local i n val ;
%let n=%sysfunc(countw(&list));
%do i=1 %to &n;
%let val = %scan(&list,&i);
%&mcr(&val);
%end;
%mend;
%let sets = apples oranges pears;
options mprint;
%loop(&sets,create);
%loop(&sets,sort);
我没有正确使用SAS,但是countw函数是否需要是
countw(&list')
?默认分隔符是空格。有关该函数的文档可在此处找到