一般来说,我们如何处理宏变量内部需要修改的情况;例如,假设我有这个宏:
%macro test (arg=);
array arrayone [&arg]; /* This is ok */
array arraytwo [&arg+1] /* This is not ok. How to make it work? */
...
当我想要 %test(3) 然后 arraytwo 需要采用维度 4... 时,我们如何管理这些情况?
将其更改为
array arraytwo[%EVAL(&ARG + 1)] ;
只要您只需要整数算术,使用 %eval 就足够了。如果您需要使用宏变量执行浮点运算,则应改用 %sysevalf。
大多数数据阶跃函数可以通过以下两种方法之一直接应用于宏变量:
1. %function()
2. %sysfunc(function())
对于许多最常用的函数,都有精确的宏等效项,您所要做的就是在函数名称前添加一个 %。通常可以通过在 %sysfunc() 中调用不具有精确宏等效项的函数来接受宏变量。NB数据步进函数通常期望用单引号括起来的字符串在通过 %sysfunc() 在一段宏代码中调用时将失败,除非您删除引号。例如
data _null_;
x = rand('uniform');
run;
在数据步骤中工作正常,但要在一段宏代码中为宏变量提供相同的值,您需要使用
%let x = %sysfunc(rand(uniform));
这是因为在宏环境中,SAS 将文本统一解释为字符串,而在数据步骤中,SAS 会将未引用的文本解释为变量的名称。