SAS宏变量更改

SAS宏变量更改,sas,sas-macro,Sas,Sas Macro,一般来说,我们如何处理需要在宏内部修改宏变量的情况;例如,假设我有以下宏: %macro test (arg=); array arrayone [&arg]; /* This is ok */ array arraytwo [&arg+1] /* This is not ok. How to make it work? */ ... 当我需要%test(3)和 阵列2需要采用尺寸4 将其更改为 数组数组两[%EVAL(&ARG+1)]; 只要您只需要整数运算,使用

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

%macro test (arg=); 
array arrayone [&arg];   /* This is ok */
array arraytwo [&arg+1] /* This is not ok. How to make it work? */ 
... 
当我需要%test(3)和 阵列2需要采用尺寸4

将其更改为


数组数组两[%EVAL(&ARG+1)];

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

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

 1. %function()
 2. %sysfunc(function())
对于许多最常用的函数,都有完全相同的宏,您只需在函数名前添加一个%即可。通常可以通过在%sysfunc()内调用宏变量,使没有完全等效宏的函数接受宏变量。注意:除非删除引号,否则在宏代码段中通过%sysfunc()调用通常需要用单引号括起来的字符串的数据步函数时将失败。例如

data _null_;
  x = rand('uniform');
run;
在数据步骤中工作正常,但要在一段宏代码中为宏变量提供相同的值,需要使用

%let x = %sysfunc(rand(uniform));
这是因为在宏环境中,SAS将统一文本解释为字符串,而在数据步骤中,SAS将不带引号的文本解释为变量名称