簡體   English   中英

SAS 宏語句 %If 和 %Let

[英]SAS Macro Statement %If and %Let

我正在嘗試解決一個問題,在該問題中,它會根據某些條件為您分配一個帶有 let function 的參數。對於本練習,我在代碼中使用 %if 和 %let 條件。 到目前為止,我以簡化方式編寫的代碼如下:

%let anio = 2022;
%let base = 2;

%Macro Data;
%if &anio = 2022 %then %do;
%Let year_add = %Str(&Base.C);
%Let year_add1 = %Str(&Base.B);
%mend;

%Data;

%put &=year_add;
%put &=year_add1;


問題是顯然宏沒有在第二個 let 語句中為我分配任何值

第一個 %put = &year_add 給了我正確的結果 2C。

不幸的是,第二個 %put = &year_add1 出現以下消息:apparent symbolic referenc yeard_add1 not resolved

任何人都可以幫助我或建議我如何根據條件分配不同的 let 語句嗎?

提前致謝。

您的宏定義缺少 %DO 的 %END。

%macro data;
%if &anio = 2022 %then %do;
%let year_add = &Base.C;
%let year_add1 = &Base.B;
%end;
%mend;

如果目標宏變量 YEAR_ADD 和 YEAR_ADD1 尚不存在,那么您的宏將創建它們作為 DATA 宏的本地變量。 因此,一旦宏完成,它們將被刪除。

最簡單的解決方案是在調用宏之前確保宏變量存在。

%let anio = 2022;
%let base = 2;
%let year_add=;
%let year_add1=

%data;

%put &=year_add;
%put &=year_add1;

如果您確定宏變量不存在於其他調用 %DATA() 的宏中,那么您可以添加一個 %GLOBAL 語句以在 GLOBAL 宏 scope 中定義它們,這樣當宏完成時它們將不會被刪除這對宏定義:

%global year_add year_add1 ;

但是如果它們被定義為本地到其他一些調用 %DATA 的宏,那將產生一個錯誤。 因此,為了安全起見,如果它們尚不存在,則只將它們強制放入 GLOBAL scope 中。

 %if not %symexist(year_add) %then %global year_add;
 %if not %symexist(year_add1) %then %global year_add1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM