【问题标题】:Macro Do Until Loop in SASSAS中的宏执行直到循环
【发布时间】:2017-07-10 13:49:34
【问题描述】:

我的循环只进行了 1 次迭代。我应该创建三个宏变量:var1 = Month1、var2 = Month2 和 var3 = Month3,如果 qtr = qtr1。当我使用 Put 语句检查它时,我的循环仅创建 var1 = Month1 和 I = 1。它只进行一次迭代,所以我不确定我做错了什么。

%Let qtr = qtr1;

%Macro Firstqtr(qtr);

%Let I = 1;

%If &qtr = qtr1 %then %do %until (&I > 3);

%Let var&I = Month&I;

%let I = %eval(&I + 1);

%end;

%Mend Firstqtr;

%Firstqtr(qtr);

【问题讨论】:

  • 您发布的程序将永远不会运行 %DO 循环,因为 %IF 语句中的条件将为 FALSE。

标签: macros sas sas-macro


【解决方案1】:

鉴于您为宏的 QTR 参数所做的输入,您的 %DO 循环将永远不会运行。您可以打开 MLOGIC 来查看。

1228  options mlogic;
1229  %Firstqtr(qtr);
MLOGIC(FIRSTQTR):  Beginning execution.
MLOGIC(FIRSTQTR):  Parameter QTR has value qtr
MLOGIC(FIRSTQTR):  %LET (variable name is I)
MLOGIC(FIRSTQTR):  %IF condition &qtr = qtr1 is FALSE
MLOGIC(FIRSTQTR):  Ending execution.

如果您想将 qtr1 作为值传入,请在宏调用中对其进行硬编码。

%Firstqtr(qtr1);

或者你可以让你的调用传入你之前定义的宏变量。

%let qtr=qtr1;
%Firstqtr(&qtr);

如果使用命名参数调用宏,可能会更清楚地区分参数值和同名外部宏变量的值。 注意:您可以在宏调用中使用参数名称,即使是在宏定义中定义为位置的参数。

%Firstqtr(qtr=&qtr);

【讨论】:

  • 很好的提示,没有意识到位置参数的问题!
【解决方案2】:
option mprint;
%global qtr;
%Let qtr = qtr1;

%Macro Firstqtr(qtr);

%Let I = 1;

%If &qtr = &qtr  %then %do %until (&I > 3);

%Let var&I = Month&I;

%let I = %eval(&I + 1);

%end;
%put &var1 &var2 &var3;

%Mend Firstqtr;

%Firstqtr(qtr);

您必须将 qtr 声明为全局变量,然后才会通过 if 条件。

【讨论】:

    【解决方案3】:

    问题是宏变量范围之一。 qtr 在全局(第 1 行)和本地(作为宏参数)都定义,因此使用本地(空)代替。

    尝试在您的参数中传递它,如下所示:

    %Let qtr = qtr1;
    
    %Macro Firstqtr(qtr);
      %Let I = 1;
      %If &qtr = qtr1 %then %do %until (&I > 3);
        %global var&i;
        %Let var&I = Month&I;
        %put var&i=&&var&i;
        %let I = %eval(&I + 1);
      %end;
    %mend Firstqtr;
    
    %Firstqtr(&qtr);
    

    请注意,您正在创建的变量将具有本地范围 - 要使它们成为全局变量,您需要将它们声明为这样(%global 语句)。

    【讨论】:

    • 我该怎么做才能让它们存在于宏之外?
    • 现在知道了!谢谢!
    • 抱歉,我想现在知道了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多