SAS:如何分配类似函数的宏的输出值?

时间:2014-08-08 11:26:11

标签: sas sas-macro

我使用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,但我不知道如何解决它。提前感谢任何帮助或消化

2 个答案:

答案 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,它可以帮助您保持模块化和易于理解。