我想知道如何从变量中设置宏名称。
像这样:
%Macro test(name);
...
%Macro new_&name;
...
%Mend;
...
%Mend test
或者如果不可能:
%macro one(name);
%let mname=&name;
%mend one;
%macro two_&name;
...
%mend;
有什么想法吗?非常感谢。
答案 0 :(得分:1)
是的,你可以做这样的事情:
%macro macroFunc();
%put hi there;
%mend;
%macro macroCall(macroName);
%¯oName.();
%mend;
%mcr2(macroFunc);
但我真的很好奇这个有意义的背景。 似乎它很快就会导致编码混乱。
答案 1 :(得分:1)
我从来不知道你不能在%MACRO语句中使用变量......但似乎是这种情况。正如SAS文档(http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#macro-stmt.htm)&#34中所述,您不能使用文本表达式在%MACRO语句中生成宏名称。"
我的下一个想法是你可能能够将%MACRO语句创建为变量,但我无法在创建变量时找到掩盖%MACRO的方法。
我终于想出了一个解决方案,但这可能不是最好的方法(并且它可能不适用于你正在尝试做的事情)。我发现我可以在数据步骤中编译宏语句。不幸的是,当整个宏代码(从%MACRO到%MEND语句)保存在变量中时,我只能从变量中运行宏。请参阅下面的代码。
%MACRO test(name);
data test;
*COMPILE MACRO STATEMENT;
pct=%nrstr('%');
name="new_&name";
beginning=pct||'MACRO '||strip(name)||'();';
*CODE TO BE INSIDE MACRO;
/*Note: SAS will encounter errors if you try to assign text containing macro
functions (e.g., %PUT, %IF, etc.) to a variable. To get around this, you must
put hide the % in the following syntax, %nrstr('%'), and concatenate/join the
syntax with the rest of the string */
code=pct||'PUT HELLO!;';
*COMPILE MEND STATEMENT;
end=pct||'MEND;';
call symput('MacroStatement',beginning||code||end); *Output var containing macro;
call symput('Execute',pct||strip(name)||';'); *Output var containing statement to run macro;
output;
run;
&MacroStatement
&Execute
%MEND;
%test(name1);
答案 2 :(得分:1)
我想到的第一件事是使用临时的fileref来构建你的宏。然后包括该fileref。
我认为这可以满足您的需求:
%macro test(x,file);
data _null_;
file &file;
format outStr $2000.;
outStr = ('%macro test_' || strip("&x") || "();");
put outStr;
put '%put hello world;';
outStr = '%put Passed in value is x:' || "&x and file: &file;";
put outStr;
put "proc means data=sashelp.class(obs=&x) mean; var age; run;";
put '%mend;';
run;
%include &file;
%mend;
filename tempfile temp;
%test(2,tempfile);
%test_2;
filename tempfile clear;
答案 3 :(得分:1)
options mprint mlogic symbolgen nospool;
%let definition=abc;
%let mdef=macro &definition.;
%&mdef.;
%put TEST;
%mend;
%abc;