首页 > 解决方案 > 多次调用宏

问题描述

我有一个非常大的宏,我想多次调用它。(我正在使用复制权重来计算我的错误。)我想为不同的变量调用该过程,比如 VAR1-VAR99。在过去,我使用了 DATA NULL步骤和 CALL EXECUTE,如下所示:

data _null_;
  do i=1 to 99;
    call execute(compress("%mymacro(VAR" || i || ")") );
    end;
  run;

不过,这一次对我不起作用。关于宏变量的范围,我可能遗漏了什么?我想打电话:

%mymacro(VAR1)
%mymacro(VAR2)
...
%mymacro(VAR99)

当然,我想在没有 99 行代码的情况下做到这一点。为什么我的方法会突然失败?还有什么其他方法可以做到这一点?

标签: sas

解决方案


这是一个使用 call execute 生成宏调用的示例。我添加了 %NRSTR,因为它可以防止宏计时问题。它使调用执行生成宏调用,而不实际执行宏。如果您的宏从数据中生成宏变量,那么如果没有 %NRSTR,您最终可能会遇到时序问题和范围问题。

%macro mymacro(var) ;
  %put var=&var  ;
%mend mymacro ;

data _null_;
  do i=1 to 5;
    call execute(cats('%nrstr(%mymacro(var',i,"))")) ;
  end;
run;

或者它可以像更改代码以使用单引号而不是双引号一样简单。单引号将阻止宏在数据步骤编译时执行。如果您的宏不从数据中生成宏变量,这可能就足够了。但我总是使用 %NRSTR。

data _null_;
  do i=1 to 5;
    call execute(compress('%mymacro(VAR' || i || ")") );
  end;
run;

推荐阅读