在调用宏时使用变量

时间:2013-08-09 20:25:12

标签: variables macros while-loop sas

我是一名业余用户,请原谅我缺乏词汇量!

%macro wtv(n);
var&n = 1;
%mend; 

do while (n < 10);
n+1;
%wtv(n); /*here's the problem I think*/
end;

这是一个想法:我想在我的宏输入中使用n(评论所在的位置)。代码只是一个简单的例子,这不是我想要做的,但你明白了!调用宏时如何使用变量(例如n)?我刚写的代码将使用n作为字符,并返回varn = 1,而不是var1 = 1,var2 = 1,var3 = 1 ... var9 = 1.

非常感谢!

2 个答案:

答案 0 :(得分:3)

作为业余爱好者,首先需要了解的是宏的几个规则:

  1. 宏输出文本/代码。
  2. 宏在运行/编译/提交代码之前运行。
  3. 总是试图了解“宏观土地”中的内容以及“数据阶段土地”中的内容。因为将首先计算“宏观土地”中的所有内容,然后将其结果输出并作为“数据步骤土地代码”运行。如果你试图在宏中引用“数据步地”中的变量,你会遇到问题,因为宏不知道/不能看到“数据步地”。
  4. 那你的例子出了什么问题?

    你的“do while”循环在数据步骤中。 “%wtv(n)”位于宏区域中并在数据步骤代码之前运行。

    宏将输入文本“n”视为其参数,并尽职地写出:

    varn = 1; 
    

    n已被替换为&amp; n,因为文本“n”作为宏变量“&amp; n”的值被输入。 Macro land完成了它的操作,代码仍然是:

    do while (n < 10);
    n+1;
    varn = 1;
    end;
    

    此代码尽职尽责,但“varn = 1;”将在while循环的每次迭代中保持不变,这可能不是你想要发生的。

    那么你想要发生什么?如果要使用代码循环遍历由n索引的变量,请使用像Hong Ooi建议的响应这样的数组。一般来说,我建议不要在常规代码就绪时使用宏。

    但实际上你有可能想要使用宏循环魔法来代替某些生产性原因。它发生了。如果是这种情况,也许你不希望数据步骤“do while”循环,而是一个宏。在这种情况下,您的wtv宏可能会变为:

    %macro wtv(n);
    %local i;  /* explicit declarations are a good habit to get into */
    %let i = 1;
    %do %while (&i <= &n); 
    var&i = 1;
    %let i = %eval(&i + 1);
    %end;
    %mend wtv;  /* explicitly named mend statements are also good */ 
    

    现在,您可以调用%wtv(5),它应该解析为数据步骤代码:

    var1 = 1;
    var2 = 1;
    var3 = 1;
    var4 = 1;
    var5 = 1;
    

    您只需要提供一个值得尊敬的数字并将其包含在数据步骤中,但缺点是您需要在不引用数据步骤变量的情况下执行此操作。因为宏在数据步骤之前运行,所以它们不能在运行时使用从数据步骤派生的信息来驱动它们自己的操作。

    如果您在编写代码时已经知道此编号,那么您已经设置好了。在这种情况下,您根本不需要数据步骤“do while”循环或数组。

答案 1 :(得分:2)

您不需要宏。改为使用数组。

data;
    array var{9} var1-var9;
    do i=1 to 9;
       var{i} = 1;
    end;
    ...

事实上,你甚至不需要循环;您可以直接在array语句中初始化变量。

    array var{9} var1-var9 (9*1);