一般来说,我们如何处理需要在宏内部修改宏变量的情况;例如,假设我有这个宏:
%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 ...?
答案 0 :(得分:5)
将其更改为
array arraytwo[%EVAL(&ARG + 1)] ;
答案 1 :(得分:3)
只要您只需要整数运算,使用%eval就足够了。如果需要使用宏变量执行浮点运算,则应使用%sysevalf。
大多数数据步骤函数可以通过以下两种方法之一直接应用于宏变量:
1. %function()
2. %sysfunc(function())
对于许多最常用的函数,有精确的宏等价物,您所要做的就是在函数名前添加一个%。通常可以通过在%sysfunc()中调用它们来接受宏变量来接受宏变量。 N.B。数据步骤函数通常期望包含在单引号中的字符串在通过%sysfunc()在一段宏代码中调用时将失败,除非您删除引号。 E.g。
data _null_;
x = rand('uniform');
run;
在数据步骤中工作正常,但要在一段宏代码中为宏变量赋予相同的值,则需要使用
%let x = %sysfunc(rand(uniform));
这是因为在宏环境中,SAS将文本 uniform 解释为字符串,而在数据步骤中,SAS会将未加引号的文本解释为变量的名称。