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
我想在另一个宏变量中存储宏引用列表,然后更改其中一个引用变量的内容。
例如:
%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