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);
我已经创建了一个 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);