创建SAS宏以创建宏变量

时间:2016-09-07 13:19:31

标签: sas sas-macro

我创建了一个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)才能正常工作。

2 个答案:

答案 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);