SAS 在宏变量中存储宏引用

SAS store macro reference in macro variable

我想在另一个宏变量中存储宏引用列表,然后更改其中一个引用变量的内容。

例如:

%LET String=FirstString; 
%LET KeepMacroNotString=&String; 
%PUT &String = &KeepMacroNotString ?;  


%LET String=String changed; 
%PUT &String = &KeepMacroNotString?; 

最后我希望 %PUT &KeepMacroNotString 解析为 "String changed"。但是它坚持第一个任务。

有什么想法吗? 谢谢,Lubenja

我找到了解决方案: %NRSTR 函数和 %UNQUOTE 函数的组合可以达到目的:

%LET String=FirstString; 
%LET KeepMacroNotString=%NRSTR(&String); 
%PUT &String = &KeepMacroNotString ?;  

%LET String=String changed; 
%PUT &String = %UNQUOTE(&KeepMacroNotString)?; 

说明:首先您必须屏蔽“&”以防止解析宏 (%NRSTR())。 但是当你想使用 marco 时,你必须再次取消对它的引用 (%UNQUOTE())。

使用数据步骤更容易。

data _null_;
  call symputx('KeepMacroNotString','&String');
run;

我不会使用这种方法,但如果您不介意日志中的警告消息(我很介意),理论上您可以只更改语句的顺序:

WARNING: Apparent symbolic reference STRING not resolved.
 57         
 58             %LET KeepMacroNotString=&String;
 59         
 60             %LET String=FirstString;
 61             %PUT &String = &KeepMacroNotString ?;
 FirstString = FirstString ?
 62         
 63             %LET String=String changed;
 64             %PUT &String = &KeepMacroNotString?;
 String changed = String changed?

这基本上是一种丑陋的方式来完成与 Tom 更优雅地完成的相同类型的间接寻址。关键是宏变量 KeepMacroNotString 的值是 &String,而不是解析值。

在宏设置中,这也可以通过赋默认值作为宏变量引用来实现,例如:

 59         %macro indirect(String=
 60                 ,KeepMacroNotString=&string
 61                 );
 62           %put _local_;
 63           %put &string = &keepmacronotstring;
 64         %mend indirect;
 65         %indirect(string=Hi)
 INDIRECT KEEPMACRONOTSTRING &string
 INDIRECT STRING Hi
 Hi = Hi