Die SAS®-Makrosprache ermöglicht SAS-Programmierern die Vielseitigkeit und Effizienz ihrer Codeentwicklung. Es ermöglicht SAS-Benutzern, Programmiercode mit „einmal geschriebenen – oft verwendeten“ Komponenten zu modularisieren und in vielen Fällen automatisch datengesteuerten SAS-Code zu generieren.
Zugehöriger Blogbeitrag: Mehrzweck-Makrofunktion zum Abrufen von Informationen über Datensätze
Makrosprache und Makroprozessor
Im Allgemeinen verarbeitet die SAS-Software Ihr SAS-Programm Schritt für Schritt und scannt es zunächst nach Makrosprachenobjekten – Makrovariablen, auf die als &somename verwiesen wird, und Makros, auf die als %somename verwiesen wird. Falls gefunden, aktiviert die SAS-Software den Makroprozessor, der diese Makroreferenzen gemäß der Syntax der Makrosprache auflöst und ersetzt, bevor SAS Ihre Programmierschritte kompiliert und ausführt.
SAS Makrosprache vs. SAS-Programmiersprache
Ein SAS–Programm besteht normalerweise aus zwei, oft miteinander verwobenen Schichten – Makroschicht und Nicht-Makroschicht, jede mit ihrer eigenen Syntax und ihrem eigenen Zeitpunkt der Kompilierung und Ausführung. Mit anderen Worten, SAS-Code ist eine Kombination aus zwei verschiedenen Sprachen:
- SAS-Programmiersprache (bestehend aus Datenschritten, PROC-Schritten und globalen Anweisungen wie LIBNAME, OPTIONS, TITLE usw.)
- SAS-Makrosprache (bestehend aus %LET, %IF, %DO, Makrofunktionen usw.), die getrennt von und vor der Ausführung des SAS-Programmiersprachencodes durch den SAS-Compiler verarbeitet wird.
Der Unterschied zwischen ihnen ist wie ein Unterschied zwischen dem Kochen einer Mahlzeit und dem Essen der Mahlzeit. In dieser Analogie Mahlzeit = Code, Kochen = SAS Makrosprache, Essen = SAS Programmiersprache. Ein klares Verständnis dieses Unterschieds ist der Schlüssel zu einem erfolgreichen SAS-Programmierer.
Zwei Arten von SAS-Makros
Es gibt zwei verschiedene Arten von SAS-Makros:
- Makros, die einen SAS-Programmiersprachencode generieren, der sich über SAS-Anweisungen oder -Schritte erstrecken kann;
- Makros, die einige Zeichenfolgenwerte generieren, die als Teil von SAS-Programmiersprachencode oder Datenwerten verwendet werden können, aber keine vollständigen SAS-Anweisungen oder -Schritte sind. Dieser Typ generiert keinen ausführbaren SAS-Code, sondern nur einen Wert.
Was ist eine SAS-Makrofunktion?
Die SAS-Makrofunktion ist ein SAS-Makro, das einen Wert generiert. Mit anderen Worten, es ist das oben beschriebene Typ-2-Makro. Wie alle SAS-Makros können auch SAS-Makrofunktionen eine beliebige Anzahl (Null oder mehr) von Positions- oder / und benannten Parametern (Argumenten) haben. SAS-Benutzer können ihre eigenen Makrofunktionen definieren, aber dabei dürfen Sie keine SAS-Sprachsyntax verwenden. Sie können vorhandene Makrofunktionen in Ihrer eigenen Makrofunktionsdefinition verwenden. Eine der mächtigsten ist unter anderem die Makrofunktion SYSFUNC, die eine Fülle von SAS-Sprachfunktionen in die SAS-Makrosprache einbindet.
Quellen von SAS-Makrofunktionen
SAS-Makrofunktionen können aus den folgenden drei Quellen stammen.
Vorgefertigte Makrofunktionen
Vorgefertigte Makrofunktionen, die Teil des Makroprozessors sind. Dies sind Makrofunktionen wie %eval, %length , %quote, %scan, %str, %sysfunc, %upcase usw. Hier finden Sie eine vollständige Liste der vordefinierten SAS-Makrofunktionen.
Auto-Call–Makrofunktionen
Auto-Call-Makros, einige davon sind Typ 1 (Makros) und einige – Typ 2 (Makrofunktionen) wie %cmpres, %left, %lowcase, %trim, %verify usw. Diese Makrofunktionen ergänzen die vordefinierten Makrofunktionen. Der Hauptunterschied zu den vorgefertigten Makrofunktionen besteht darin, dass die Auto-Call-Makrofunktionen Programmbeispiele der benutzerdefinierten Makrofunktionen sind, die in SAS macro Language geschrieben und Ihnen zur Verfügung gestellt werden, ohne sie definieren oder in Ihre Programme aufnehmen zu müssen. Die Auto-Call-Makrofunktionen werden mit Ihrer SAS-Softwareinstallation geliefert und sind normalerweise für Sie vorkonfiguriert, indem Sie die Systemoptionen MAUTOSOURCE und SASAUTOS= macro festlegen. Sie können mehrere Makrobibliotheken enthalten, abhängig von den an Ihrem Standort lizenzierten SAS-Produkten. Für meine SAS-Basisinstallation befindet sich die Auto-Call-Makrobibliothek beispielsweise im folgenden Ordner:
C:\Program Files\SASHome\SASFoundation\9.4\core\sasmacro
Hier finden Sie eine ausgewählte Liste von Makros für automatische Aufrufe, die mit der SAS-Software bereitgestellt werden.
Vom Standpunkt der Verwendung werden Sie keinen Unterschied zwischen den vorgefertigten und den Auto-Call-Makrofunktionen bemerken. Zum Beispiel ist die Makrofunktion%upcase() vorkonfiguriert, während die Makrofunktion% lowcase() eine Makrofunktion zum automatischen Aufrufen ist. Sie gehören völlig unterschiedlichen Familien an, aber wir benutzen sie, als wären sie komplementäre Geschwister.
Benutzerdefinierte Makrofunktionen
Schließlich gibt es benutzerdefinierte Makrofunktionen, die nicht mit SAS-Installation kommen. Dies sind die Makrofunktionen, die Sie selbst definieren. Normalerweise werden sie getrennt von den Auto-Call-Makros gehalten, hauptsächlich um sie von SAS-gelieferten Makros zu unterscheiden.
Um den Zugriff auf Ihre eigene SAS-Makrobibliothek zusätzlich zur Auto-Call-Makrobibliothek (oder Bibliotheken) zu aktivieren, können Sie die Systemoption INSERT= verwenden:
options insert=(sasautos=“path_to_your_own_macro_library_folder“);
Anstatt den SASAUTOS-Wert zu ersetzen, fügt diese Option einen zusätzlichen Wert als ersten Wert in die vorhandene SASAUTOS-Option ein, sodass Sie zuerst auf Ihre eigene Makrobibliothek und dann auch auf voreingestellte SAS-Auto-Call-Bibliotheken zugreifen können.
Benutzerdefinierte Makrofunktion erstellen
Betrachten wir das folgende Beispiel. Angenommen, wir möchten eine Makrofunktion erstellen, die einen Datensatznamen als Argument verwendet und einen Wert zurückgibt, der der Anzahl der Beobachtungen in diesem Datensatz entspricht.
Wir wissen, dass der folgende Code die Anzahl der Beobachtungen in einem Datensatz berechnet:
data _null_; callputx('NOBS',n); stop; set SASHELP.% nobs=n;run; %put &=NOBS;NOBS=428
Können wir eine SAS-Makrofunktion erstellen, indem wir diesen Code in ein Makro einschließen? Etwa so:
%Makro nobs(dset=,result=); %global &Ergebnis; data _null_; callputx("&Ergebnis",n); stop; set &dset nobs=n; ausführen;%mend nobs;
Die Antwort ist „Nein“. Ja, wir haben ein gültiges Makro erstellt; wir können dieses Makro aufrufen, um das Ergebnis zu erzeugen:
%nobs(dset=SASHELP.AUTOS, result=NOBS);%put &=NOBS;NOBS=428
Dies ist jedoch keine Makrofunktion. Erinnern Sie sich an Typ-2-Makros, die keinen SAS-Programmiersprachencode generieren, sondern nur einen Wert? Dieses Makro generiert jedoch SAS-Code, der der als zweites Argument angegebenen Makrovariablen einen Wert zuweist (result=NOBS ).
Um eine gültige Makrofunktion zu erstellen, sollte unser Makro keinen SAS–Sprachcode enthalten – weder einen DATA- noch einen PROC-Schritt. Es darf nur aus dem SAS-Makro-Sprachcode bestehen. Hier ist es:
%Makro-Nobs(dset); %lokale dsid n; %let dsid = %sysfunc(open(&dset)); %if &dsid %then %do; %let n = %sysfunc(attrn(&dsid, nlobs)); %Lassen Sie dsid = %sysfunc(schließen(&dsid)); %Ende; %sonst %setzen %sysfunc(sysmsg()); &n%mend nobs;
Wenn der Makroprozessor dieses Makro ausführt, ist das einzige Objekt, das an den SAS language Compiler übergeben wird, der Wert, der in der Zeile direkt vor %mend angezeigt wird. Dies ist der berechnete Wert der Anzahl der Beobachtungen (bezeichnet mit &n ). Dies ist das einzige, was vom SAS-Sprachcompiler sichtbar ist, der Rest ist der sichtbare Makrosprachencode, der vom SAS-Makroprozessor verarbeitet wird.
WICHTIG: Verwenden Sie beim Definieren einer Makrofunktion immer die Anweisung %local, um ALLE Makrovariablen aufzulisten, die in Ihrem Makro erstellt werden, um sicherzustellen, dass sie nicht versehentlich gleichnamige Makrovariablen in der aufrufenden Umgebung überschreiben. Sie müssen %local für Makroparameter nicht deklarieren, da sie immer automatisch lokal sind.
Beispiele für die Verwendung von SAS-Makrofunktionen
Wenn eine Makrofunktion auf diese Weise definiert ist, wo immer Sie ihren Aufruf platzieren %nobs(SASHELP.2) In Ihrem SAS-Code wird er vom SAS-Makroprozessor ausgewertet und durch den entsprechenden Wert (in diesem Fall die Nummer 428) ersetzt. Auf diese Weise können Sie minderwertige Hardcodierung vermeiden und Ihren SAS-Code dynamisch und leistungsstark machen. Sie können Makrofunktionen in vielen SAS-Codierungskontexten verwenden. Beispiel:
- Zuweisungsanweisungen für die Makrovariable: %let NOBS=%nobs(SASHELP.CARS);
- Zuweisungsanweisung in einem Datenschritt: x = %nobs(SASHELP.CARS);
- Als Teil eines Ausdrucks in einem Datenschritt: x = %nobs(SASHELP.2)/2 + 3;
- Als Wert eines Datenschritts do loop: habe ich=1 zu %nobs(SASHELP.AUTOS);
- Als Wert eines Makros do Schleife: %do &i=1 %bis %nobs(SASHELP.AUTOS);
- Als Teil der Bedingung in der IF-Anweisung: if %nobs(SASHELP.AUTOS) > 500 dann mach;
Und so weiter. Es ist wichtig zu beachten, dass Argumente (Parameter) für Makrofunktionen entweder SAS-Konstanten oder Makroausdrücke sein müssen, die in SAS-Konstanten aufgelöst werden. Da Makrofunktionen vor der SAS-Programmausführung vom Makroprozessor aufgelöst werden, können die Argumente keine Variablennamen sein. Dies ist der Hauptunterschied zwischen Makrofunktionen und SAS-Funktionen.
Deine Gedanken?
Finden Sie diesen Beitrag nützlich? Verwenden Sie SAS-Makrofunktionen? Können Sie andere Anwendungsbeispiele vorschlagen? Bitte teilen Sie mit uns in den Kommentaren unten.