2011-03-25 15 views
6

Genel olarak makro değişkenlerin makro içinde değiştirilmesi gereken durumla nasıl ilgileniriz; İstediğim zamanSAS makro değişken değişimi

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

Nasıl bu durum yönetirim% testi (3) ve daha sonra bir boyut 4 atması gereken arraytwo ...: örneğin, bu makro mi var? % Eval kullanarak

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

cevap

5

Değişim bunu yalnızca tamsayı aritmetik gerektirir sürece yeterlidir. Makro değişkenlerle kayan nokta aritmetiği yapmanız gerekiyorsa, bunun yerine% sysevalf kullanmalısınız.

Çoğu veri adım fonksiyonları iki yöntemden birini kullanarak makro değişkenlere doğrudan uygulanabilir: En sık kullanılan fonksiyonların çoğu için

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

, orada kesin makro eşdeğerleri vardır ve yapmanız gereken tek şey işlev adının önüne% bir değer ekleyin. Tam makro eşdeğerlerine sahip olmayan işlevler genellikle% sysfunc() içinde çağırarak bir makro değişkenini kabul etmek için yapılabilir. N.B. Alıntıları kaldırmazsanız, genellikle% sysfunc() yoluyla bir makro kodu parçası çağrıldığında, tek tırnak içine sarılmış bir dize beklemede olan veri adımı işlevleri başarısız olur. Örneğin.

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

veri adımda çalışıyor, ancak bir makro değişkeni makro kod parçası aynı değeri vermek, sen çünkü makro ortamda

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

Bu kullanmanız gerekir SAS, tekdüzen metnini bir dize olarak yorumlarken, bir veri adımında SAS, gönderilmemiş metni bir değişkenin adı olarak yorumlar.