2016-09-07 202 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