我使用SAS非常新,我很难尝试将类似函数的宏的输出值分配给宏变量。测试后,我检查了值是否正确计算,但一旦我尝试分配它,程序崩溃。在这里你可以找到代码
%MACRO TP_BULLET(ZCURVE,TAU,YF=1);
/* KEEP ONLY THE ZERO CURVE UNTIL MATURITY*/
DATA _TEMP;
SET &ZCURVE;
IF MATURITY > &TAU THEN DELETE;
RUN;
PROC SQL NOPRINT;
SELECT DISTINCT 1- DF
INTO :NUME
FROM _TEMP
GROUP BY MATURITY
HAVING MATURITY = MAX(MATURITY);
QUIT;
PROC SQL NOPRINT;
SELECT SUM(DF)
INTO :DENO
FROM _TEMP;
QUIT;
PROC DELETE DATA=_TEMP;RUN;
%LET TP = %SYSEVALF(&YF*&NUME / &DENO);
&TP
%MEND TP_BULLET;
%MACRO TESTER2;
%LET K = %TP_BULLET(ZCURVE,TAU,YF=1);
%PUT .......&K;
%MEND TESTER2;
%TESTER2;
我得到的错误如下
WARNING: Apparent symbolic reference DENO not resolved.
WARNING: Apparent symbolic reference NUME not resolved.
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was:
1*&NUME / &DENO
所以我认为DATA Step无法创建sas表_TEMP,但我不知道如何解决它。提前感谢任何帮助或消化
答案 0 :(得分:2)
这不是'函数'宏 - 您正在混合使用SAS Macro语言和Base SAS。请记住,SAS Macro语言是一个代码生成器 - 您正在生成代码,目前类似于:
%let K=data _temp; set ZCURVE; ....
请注意以上内容不是您想要分配给宏变量K的内容。
要获得帮助,请尝试使用options mprint
运行您的宏 - 这将显示您的宏生成的代码。
如果你想让你的宏像一个函数一样,那么(至少)你应该找到没有通过mprint选项生成的代码..
答案 1 :(得分:0)
除了所有哲学问题,您可以在宏中添加一个参数,指定您要创建的新宏变量(mv)。而不是
%Let k = %TP_BULLET(ZCURVE,TAU,YF=1);
你可以打电话
%TP_BULLET(ZCURVE,TAU,mvOutput=k,YF=1);
;
您的宏需要稍微修改
%MACRO TP_BULLET(ZCURVE,TAU,mvOutput,YF=1);
%GLOBAL &mvOutput;
........ Same code as above .........
%Let &mvOutput = &TP; *Instead of final line with '&TP';
%MEND;
这不是一种非常简单的方法,但如果您使用更多的编程背景而不是SAS,它可以帮助您保持模块化和易于理解。