Create SAS macro 创建宏变量

Create SAS macro to create a macro variable

我已经创建了一个 SAS 宏,宏 A,它接受一个变量名和 returns 那个名字的转换版本,即如果你 运行 %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,即 returns 转换后的变量名称:

%macro A(var);
    &var._log
    &var._exp
    &var._10
%mend

我无法使第二个宏(上面写的 B)正常工作。

这并不难。您需要遍历 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;

所以如果内部宏只是返回字符,也就是说它实际上并不生成任何非宏语句,那么为什么不让外部宏以同样的方式工作呢?

%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);