簡體   English   中英

數據步驟中宏變量的解析

[英]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版本開始,您可以在開放代碼中使用它,否則將其放在宏定義中並執行該宏。

  • SYMGET()將返回一個字符變量。
  • RESOLVE()將返回一個字符變量,但是它需要參數中的&。
  • &log_flag將解析為數字

您需要根據參考方法正確對待它們。

這是一個獨立測試每個示例的示例,然后您可以根據需要通過嵌套一起對它們進行測試。

%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.

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