2011-03-25 262 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將解釋未加引號的文本作爲變量的名稱。