2016-04-07 14 views
2

Ich versuche ein Makro zu verwenden, um einige Array-Variablen in SAS zu beschriften, um zu vermeiden, viele Codezeilen eingeben zu müssen. Was ich versuche das ist im Grunde zu tun:SAS: Array an Makro übergeben

%macro LABEL_ARRAY(V); 
%DO I = 1 %TO 4; 
    %let variablename=&V(&I); 
    array1[&I] = "Value of &variablename" 
%END 
%MEND LABEL_ARRAY; 

So V ist ein Array die entsprechenden Variablennamen für die Positionen in der Anordnung array1 enthält. Ich versuche, dies für mehr als 4 Variablen pro Array und für zahlreiche Arrays zu tun, aber das ist die Grundidee. Im Grunde genommen ist das Array1 [& I], das ich Array1 [1] für den ersten Eintrag sagen möchte, verwendet nicht den Wert von I, sondern nur & I, dasselbe mit & Variablenname.

Irgendwelche Vorschläge, was passieren könnte? Vielen Dank.

+0

Sie könnten% vermietet Variablennamen versuchen = & &V(&I); zu sehen, ob das funktioniert, aber ich vermute nicht. Ändern Sie es tatsächlich zu:% Lassen Sie Variablenname = &&V&I; und das sollte funktionieren – DCR

+0

Ich bin verwirrt, was Sie wollen. Können Sie einen Datenschritt anzeigen, der Ihr Makro verwendet? Sie sagen, Sie möchten Variablen benennen, aber es gibt keine LABEL-Anweisung. Array1 [& i] wird zu array1 [1] aufgelöst, wie Sie sagen, dass Sie wollen. & Variablenname wird nicht in einen Variablennamen aufgelöst. Vielleicht möchten Sie sich die VNAME-Funktion ansehen. Sie können jedoch keine Datenschrittmatrix verwenden, um Variablenbeschriftungen zuzuweisen. – Quentin

+0

@Quentin Vermutlich baut dies eine Reihe von label-Anweisungen auf, die dann wie 'label% label_array (v);' – Joe

Antwort

2

Es gibt keinen integrierten Array-Typ in der Makrosprache (in der Makrosprache gibt es überhaupt keine Typen) in SAS.

Makroarrays werden stattdessen durch mehrfache Auflösung des Et-Zeichen behandelt. Ich empfehle Ihnen, lesen Sie this answer für weitere Informationen darüber, wie genau das im allgemeinen Fall funktioniert.

Für den speziellen Fall von Makrovariablen "Arrays" ist es jedoch sinnvoll zu erklären, wie sie genau funktionieren.

Was haben Sie wahrscheinlich eine Reihe von Makrovariablen wie folgt:

%let v = Color; 
%let color1=Blue; 
%let color2=Red; 
%let color3=Green; 

Und Sie wollen in der Lage sein zu tun:

%do _i = 1 to 3; 
    %let thisColor = &color&_i; 
%end; 

Außer das nicht funktioniert - weil &color Entschlüssen (und wahrscheinlich löst sich auf &color, wenn Sie nicht separat definieren), und &i löst auf 1, so dass Sie mit &color1, aber nicht Blue, plus eine Warnmeldung über &color löst nicht auf.

Was Sie tun müssen, ist die Auflösung von &color zu verzögern, bis &_i verrechnet wird. Sie können das tun, indem Sie ein zweites Et-Zeichen hinzufügen.

%do _i = 1 to 3; 
    %let thisColor = &&color&_i; 
%end; 

Was das tut, ist erzählt SAS für die Lösung der beiden && einem & aber halten Sie es in der Warteschlange zu lösen; dann in einem zweiten Durchlauf, lösen Sie diese einzelne &. So haben Sie

&&color&_i 
&color1 
Blue 

Statt auf der zweiten Ebene zu stoppen.

Dies wird ausführlicher in meinem Artikel Unravelling the Knot of Ampersands und Ron Fehds Array: Construction and Usage of Arrays of Macro Variables erklärt.

+0

Darüber hinaus würde ich Sie ermutigen, Alternativen zu den Makro-Variablen-Array zu betrachten, da es oft einfacher ist, Dinge wie diese mit datengesteuerter Programmierung zu tun (google SAS + das). – Joe

+0

Wow, danke, @Joe, das ist alles super hilfreich! – kyro1021