【问题标题】:using a variable when calling a macro调用宏时使用变量
【发布时间】:2013-08-11 21:07:45
【问题描述】:

我是一个业余 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 = 1var2 = 1var3 = 1...var9 = 1

非常感谢!

【问题讨论】:

    标签: variables macros while-loop sas


    【解决方案1】:

    您不需要宏。请改用数组。

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

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

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

    【讨论】:

      【解决方案2】:

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

      1. 宏输出文本/代码。
      2. 宏在代码运行/编译/提交之前运行。
      3. 始终尝试了解“宏观领域”中的内容以及“数据步骤领域”中的内容。因为“宏观土地”中的所有内容都会先计算出来,然后将其结果作为“数据步土地代码”输出并运行。如果您尝试在宏中从“数据步域”引用变量,则会遇到问题,因为宏不知道/看不到“数据步域”。

      那么你的例子出了什么问题?

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

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

      varn = 1; 
      

      n 已被 &n 替换,因为文本“n”作为宏变量“&n”的值输入。宏地运行完毕,剩下的代码如下:

      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 -- 这是一个很难理解的概念,尤其是如果一个人习惯了大多数现代编程语言的工作方式。很好地解释了它的细微差别。
      猜你喜欢
      • 2019-02-05
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多