Sparc_Spread, SAS makro dilinde sorununuzu çözebilecek "referans olarak nasıl aranacağını" açıklar. Yine de bu özel durumda, bu, referans ile arama kullanmak için çok önemli değildir ve bunu kullanmak için SAS makro dilinin deyimsel olmadığını iddia etmem (her ne kadar yanlış bir şey olsa da) - sadece biraz garip görünüyor, ve gerçekten de yerel bir konsept olmadığından biraz daha zordur, ancak istenirse bu şekilde kullanılması kesinlikle kasıtlı olarak desteklenir). Bunu aşmanın iki yolu vardır, her ikisi de kullanımı çok kolaydır.
Her şeyden önce, arttırmak istediğiniz değişken ismini bildiğinizi ve başlangıç değerinin tek ilginç şey olduğunu varsayalım. SAS makro dilinin kapsam belirleme, tam olarak sözcüksel kapsam belirleme ve tam olarak işlevsel olmayan bir şeyle, otomatik olarak zaten var olduğunda, en yerel kapsamda bulunan değişkeni kullanır (makro kullanarak bazı küçük uyarılar ile) kullanır. DOSUBL).
Yani bu beklendiği gibi çalışır:
Eğer & variable1 201 değerini almasını bekliyorsanız
%macro macro2(counter=);
%do variable1 =&counter. %to 200;
%if %sysfunc(mod(&variable1.,50))=0 %then %put &=variable1;
%end;
%mend macro2;
%macro macro1();
%let variable1= 0;
%macro2(counter=&variable1.);
%put &=variable1;
%mend macro1;
%macro1;
(Tabii, yani - %do
döngüler, do
döngüler gibi, her zaman daha yüksek bir artırılır olsun çünkü onların . değerini biten keşke gerçek prosedür farklı çalışır varsayıyorum)
&variable1.
%macro2
atıfta çünkü var
otomatik olarak en yerel kapsamında bir mevcut -. Bu durumdakapsamı olan 0. Bir sayıcı amacıyla bu %macro2
kullanıyorsanız
Alternatif, ben function-style macro
yöntemini kullanırsınız.
Tanım gereği bir işlev stili makrosu, yalnızca tek bir değer döndüren birdir - ve returns
ile düz metinde sunulan makronun kodunun sonunda tek bir değere sahiptir. , sadece normal SAS dil ayrıştırıcısı tarafından ayrıştırılacak bir metin oluşturmayı amaçlamaktadır).
Bu, daha sonra bir atama bildirisinde eşit bir işaretin sağ tarafında kullanılabilir. Anahtar, yalnızca makro dil öğelerini - %do
döngüler ve benzeri - ve hiçbir veri adımı, proc, vb., Atama deyiminde eşit bir işaretin sağ tarafında olmasını engelleyecek dil kullanmamasıdır (ör. x=%macrostuff();
x=proc sql(select...)
).
Böylece, aşağıdakiler hedefe ulaşır: bir sayacı bir miktar artırır, değeri (201, bu durumda, daha önce olduğu gibi) döndürür ve sonra bir makro değişkenine atanabilir.
bu Bunu gerçekleştirmek için en deyimsel yolu ve en basit öneririm
%macro macro2(counter=);
%do internal_counter =&counter. %to 200;
%if %sysfunc(mod(&internal_counter.,50))=0 %then %put &=internal_counter.;
%end;
&internal_counter.
%mend macro2;
%macro macro1();
%let variable1= %macro2(counter=0);
%put &=variable1;
%mend macro1;
%macro1;
: Eğer girdi olarak istediğiniz değeri geçmesi, fonksiyon üzerinde çalışır, sonra bir değişkene atamak değerini döndürür Ancak makronuzda istersiniz.
Teşekkürler, dikkat çekildi ... Biraz dil tonunu atarım. –
Güncelleme için teşekkürler! – Joe
Teşekkürler düşünüyorum bu mantıklı. Yarın deneyeceğim. Bununla birlikte, eğer makro2'nin değerleri veya makro değişkenleri alabilecek kadar genel olamayacağı anlamına gelip gelmediğini merak ediyorum. Yukarıda yazıldığı gibi, şimdi sadece makro değişkenler almakla sınırlıdır? – DanRoDuq