2016-09-07 155 views
1

我创建了一个SAS宏宏A,它接受一个变量名称并返回该名称的转换版本,即如果您运行%A(asdf),则退出asdf_log asdf_exp asdf_10。我想写另一个宏,即宏B,它接收来自第一个宏的输出并将它们一起附加到一个新的宏变量中。创建SAS宏以创建一个宏变量

%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

你可以发布一些示例值吗?乍一看,它看起来像你有太多的分号。 – Tom

+0

嗨,汤姆,是的,由于奇怪的分号放置不会运行。明天我会举一个更全面的例子。但是,我想要的是&outputName包含两次(或更多次)运行宏A的结果。 – Sheldon

回答

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); 
+0

这很整洁,而且你是正确的,因为我的宏并没有真正做任何事情,它可能只是返回字符/ – Sheldon

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; 
+0

谢谢@DomPazz,那就是我一直在寻找的东西。将变量设置为全局变量,然后像这样添加。 – Sheldon

+1

如果在一些正在运行的本地环境中已存在,则无法创建全局宏变量。如果不是%symexist(&outputname)%,那么%global&outputname;' – Tom

+0

此外,我需要使用'%let&outputName = &&& outputName%A(&var);'来让它正确地协调列表。 – Sheldon