6

一般来说,我们如何处理宏变量内部需要修改的情况;例如,假设我有这个宏:

%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... 时,我们如何管理这些情况?

4

2 回答 2

5

将其更改为

array arraytwo[%EVAL(&ARG + 1)] ;

于 2011-03-25T09:42:15.220 回答
3

只要您只需要整数算术,使用 %eval 就足够了。如果您需要使用宏变量执行浮点运算,则应改用 %sysevalf。

大多数数据阶跃函数可以通过以下两种方法之一直接应用于宏变量:

 1. %function()
 2. %sysfunc(function())

对于许多最常用的函数,都有精确的宏等效项,您所要做的就是在函数名称前添加一个 %。通常可以通过在 %sysfunc() 中调用不具有精确宏等效项的函数来接受宏变量。NB数据步进函数通常期望用单引号括起来的字符串在通过 %sysfunc() 在一段宏代码中调用时将失败,除非您删除引号。例如

data _null_;
  x = rand('uniform');
run;

在数据步骤中工作正常,但要在一段宏代码中为宏变量提供相同的值,您需要使用

%let x = %sysfunc(rand(uniform));

这是因为在宏环境中,SAS 将文本统一解释为字符串,而在数据步骤中,SAS 会将未引用的文本解释为变量的名称。

于 2012-02-26T21:06:06.960 回答