2011-03-25 153 views
6

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

%macro test (arg=); 
array arrayone [&arg]; /* This is ok */ 
array arraytwo [&arg+1] /* This is not ok. How to make it work? */ 
... 

我们如何管理这些情况时,我想测试%(3),然后 arraytwo需要采取维4 ...?

回答

5

将其更改为

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

3

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

大多数数据跳跃功能可以直接通过以下两种方法之一被应用到宏观变量:

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

对于许多最常用的功能,有确切的宏观等效,和所有你需要做的就是在函数名称的前面添加一个%。通常可以通过在%sysfunc()中调用它们来接受一个宏变量,而不具有完全相同的宏的函数。 N.B.通常期望用单引号括起来的字符串的数据步函数在通过%sysfunc()调用一段宏代码时将失败,除非删除引号。例如。

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

在数据步工作正常,但给宏变量在一块宏代码相同的值,你就需要使用

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

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