我创建了一个SAS宏,宏A,它接受一个变量名并返回该名称的转换版本,即如果你运行%A(asdf)
,你就会得到asdf_log asdf_exp asdf_10
。我想写另一个宏,宏B,它从第一个宏获取输出并将它们一起附加到一个新的宏变量中。
%macro B(varList, outputName);
%let &outputName =
%A(var1);
%A(var2);
;
%mend
几乎是我想要做的,除了它显然没有编译。 我也不确定这是否可以在SAS中使用。 作为一个进一步的复杂性,宏B的输入是一个变量列表,我想运行宏A并附加到一个长变量名列表中。
为什么呢?因为我有一个在变量列表上运行的宏,我想在变换的变量列表上运行它。
实施例:
我有%let varList = x y;
,我希望作为输出x_log x_exp x_10 y_log y_exp y_10
。要做到这一点,我想要两个宏,宏A,返回转换后的变量名称:
%macro A(var);
&var._log
&var._exp
&var._10
%mend
我无法获得第二个宏(如上所述的B)才能正常工作。
答案 0 :(得分:2)
这不太难。您需要在varList
中循环显示值,并将结果附加到outputName
。您还需要将outputName
声明为GLOBAL,以便可以在%B
%macro B(varList, outputName);
%global &outputName;
%let &outputName = ;
%local i n var;
%let n = %sysfunc(countw(&varList));
%do i=1 %to &n;
%let var = %scan(&varList,&i);
%let &outputName = &outputName %A(&var);
%end;
%mend;
答案 1 :(得分:2)
因此,如果内部宏只是返回字符,那就是它实际上不会生成任何非宏语句,那么为什么不使外部宏以相同的方式工作呢?
%macro inner(x);
&x._log &x._exp &x._10
%mend;
%macro outer(list);
%local i;
%do i=1 %to %sysfunc(countw(&list));
%inner(%scan(&list,&i))
%end;
%mend outer;
%let want=%outer(X y Z);