我已经创建了一个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)正常工作。
发布于 2016-09-07 17:21:22
因此,如果内部宏只返回字符,也就是说,它实际上不会生成任何非宏语句,那么为什么不让外部宏以同样的方式工作呢?
%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);
发布于 2016-09-07 14:12:31
这并不太难。您需要循环遍历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;
https://stackoverflow.com/questions/39371031
复制