[英]Resolution of Macro Variables in a Data Step
我在讓If / Then語句在數據步驟中與宏變量一起正常工作時遇到麻煩。 我正在編寫一個宏來處理兩種不同的情況:計算無轉換的統計測試,然后在自然對數轉換后計算統計測試。 如果我的數據未通過正常性測試,則記錄轉換並再次測試。 如果通過,則將我的全局標志log_flag
設置為1。然后,我想在數據步驟中測試該標志的狀態,以便正確處理已轉換(或未轉換)的變量。 我嘗試了以下變化:
Data want;
set have;
if symget("log_flag")=1 then do;
if &log_flag. = 1 then do;
if resolve("log_flag")=1 then do;
test=symget("log_flag");
if test=1 then do;
end
不管我嘗試什么,本質上都會忽略if / then語句,並且即使if / then為false,它后面的所有代碼也會被視為if / then為true。 我知道為log_flag
正確分配了零值,因為%if
%then
語句可以在打開的代碼中正常工作並正確執行。 我只是很難讓它在數據步驟中正確解析。
請讓我知道您是否需要其他信息來幫助我解決這個問題。 多謝你們!
您在注釋中發現的問題是,您根本不想生成SAS代碼。 那就是宏語言處理器的作用。 因此,請使用%IF
有條件地生成代碼。
因此,如果您只想在宏變量log_flag
為1時創建變量newvar
,則可以采用這種方式進行編碼。
data want ;
set have ;
%if &log_flag. = 1 %then %do;
newvar= x*y ;
%end;
run;
因此,當&log_flag. = 1
&log_flag. = 1
您運行以下代碼:
data want ;
set have ;
newvar= x*y ;
run;
如果不是,則運行以下代碼:
data want ;
set have ;
run;
從SAS 9.4 M5版本開始,您可以在開放代碼中使用它,否則將其放在宏定義中並執行該宏。
您需要根據參考方法正確對待它們。
這是一個獨立測試每個示例的示例,然后您可以根據需要通過嵌套一起對它們進行測試。
%let log_flag=1;
Data want;
set sashelp.class;
if symget("log_flag")='1' then do;
put "Test #1 is True";
end;
if &log_flag. = 1 then do;
put "Test #2 is True";
end;
if resolve("&log_flag")="1" then do;
put "Test #3 is True";
end;
test=symget("log_flag");
if test='1' then do;
put "Test #4 is True";
end;
run;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.