Sas® Macro taal stelt SAS programmeurs enorm veelzijdigheid en efficiëntie van hun code ontwikkeling. Het stelt SAS-gebruikers in staat om programmeercode te modulariseren met “eenmaal geschreven – vele malen gebruikt” componenten, en in veel gevallen automatisch data-driven SAS-code te genereren.
gerelateerd blogbericht: Multi-purpose macro functie voor het verkrijgen van informatie over datasets
Macro taal en macro processor
in het algemeen verwerkt SAS software uw SAS programma stap voor stap, eerst scannen naar macro taal objecten – macro variabelen refereren als &somename, en macro ‘ s refereren als %somename. Indien gevonden, activeert SAS-software macroprocessor die deze macroverwijzingen oplost en vervangt volgens de syntaxis van de macrotaal voordat SAS uw programmeerstappen compileert en uitvoert.
SAS macro language vs. SAS-programmeertaal
een SAS-programma bestaat meestal uit twee, vaak met elkaar verweven lagen – macro-laag en niet-macro-laag, elk met zijn eigen syntaxis en zijn eigen timing van compilatie en uitvoering. Met andere woorden, SAS code is een combinatie van twee verschillende talen:
- SAS programmeertaal (bestaat uit data stappen, PROC stappen en globale statements zoals LIBNAME, opties, titel etc.)
- SAS macro taal (bestaat uit %LET, %IF, %DO, macro functies etc.) die afzonderlijk wordt verwerkt van en voordat SAS compiler SAS programmeertaal code uitvoert.
het verschil tussen hen is als een verschil tussen het koken van een maaltijd en het eten van de maaltijd. In deze analogie maaltijd = code, koken=SAS macro taal, eten=SAS programmeertaal. Duidelijk begrip van dit verschil is de sleutel tot het worden van een succesvolle SAS programmeur.
twee soorten SAS-macro ‘s
er zijn twee verschillende soorten SAS-macro’ s:
- macro ‘ s die enkele SAS-programmeertaal-code genereren die zich kan uitstrekken over SAS-statements of-stappen;
- macro ‘ s die een aantal tekenreekswaarden genereren die kunnen worden gebruikt als onderdeel van SAS programmeertaal code of data waarden, maar het zijn geen complete SAS statements of stappen. Dit type genereert geen SAS uitvoerbare code, alleen een waarde.
Wat is een SAS-macrofunctie?
SAS macro functie is een SAS macro die een waarde genereert. Met andere woorden, het is de type 2 macro hierboven beschreven. Zoals elke SAS-macro ‘ s, kunnen SAS-macrofuncties elk aantal (nul of meer) van positionele of/en benoemde parameters (argumenten) hebben. SAS-gebruikers kunnen hun eigen macrofuncties definiëren, maar daarbij mag u geen SAS-taalsyntaxis gebruiken; alleen SAS-macrosyntaxis is toegestaan. U kunt bestaande macro functies gebruiken in uw eigen macro functie definitie. Onder anderen, een van de meest krachtige is %SYSFUNC macro functie die een schat aan SAS taal functies in Sas macro taal brengt.
bronnen van SAS-macrofuncties
SAS-macrofuncties kunnen afkomstig zijn van de volgende drie bronnen.
voorgebouwde macrofuncties
voorgebouwde macrofuncties die deel uitmaken van de macroprocessor. Dit zijn macro functies als %eval, % length, % quote, % scan, % str, % sysfunc, % upcase, etc. Hier is een complete lijst van de vooraf gebouwde SAS macro functies.
Auto-call macro functies
Auto-call macro ‘s, sommige van hen zijn type 1 (macro’ s), en sommige – type 2 (macro functies) zoals %cmpres, %left, %lowcase, %trim, %verify, etc. Deze macro functies vullen de vooraf gebouwde macro functies aan. Het belangrijkste verschil met de pre-built macro functies is dat de auto-call macro functies zijn programma voorbeelden van de door de gebruiker gedefinieerde macro functies die zijn geschreven in Sas macro taal en beschikbaar voor u zonder te definiëren of op te nemen in uw programma ‘ s. De auto-call macro functies komen met uw SAS software installatie en meestal vooraf geconfigureerd voor u door het instellen van mautosource en SASAUTOS= macro systeem opties. Ze kunnen verschillende macrobibliotheken bevatten, afhankelijk van de SAS-producten die op uw site zijn gelicentieerd. Bijvoorbeeld, voor mijn sas-basisinstallatie bevindt de macrobibliotheek automatisch aanroepen zich in de volgende map:
C:\Program Files \ SASHome \ SASFoundation \ 9.4 \ core \ sasmacro
Hier is een geselecteerde lijst van macro ‘ s die automatisch worden aangeroepen met SAS-software.
vanuit het gebruiksstandpunt zult u geen verschil merken tussen de voorgebouwde en de automatische aanroep macro functies. Bijvoorbeeld, macro functie % upcase () is pre-built, terwijl macro functie %lowcase () is auto-call macro functie. Ze behoren tot totaal verschillende families, maar we gebruiken ze als complementaire broers en zussen.
door de gebruiker gedefinieerde macrofuncties
tenslotte zijn er door de gebruiker gedefinieerde macrofuncties die niet bij SAS-installatie worden geleverd. Dit zijn de macro functies die je zelf definieert. Meestal worden ze gescheiden gehouden van de macro ’s die automatisch worden aangeroepen, voornamelijk om ze te onderscheiden van SAS-geleverde macro’ s.
om toegang tot uw eigen SAS-macrobibliotheek in te schakelen naast de macrobibliotheek (of bibliotheken) die automatisch wordt aangeroepen, kunt u de optie INSERT= system gebruiken:
Opties insert=(sasautos=”path_to_your_own_macro_library_folder”);
in plaats van de SASAUTOS-waarde te vervangen, voegt deze optie een extra waarde toe aan de bestaande SASAUTOS-optie als de eerste waarde, waardoor u eerst in uw eigen macrobibliotheek kunt tappen, en dan ook in vooraf ingestelde SAS auto-call-bibliotheken.
Creating user-defined macro function
laten we het volgende voorbeeld bekijken. Stel dat we een macrofunctie willen maken die een naam van een gegevensset als argument neemt en een waarde retourneert die gelijk is aan het aantal waarnemingen in die gegevensset.
we weten dat de volgende code het aantal waarnemingen in een gegevensverzameling berekent:
data _null_; Call symputx('NOBS',n); stop; set SASHELP.CARS nobs = n; run; % put & = NOBS; NOBS=428
kunnen we een SAS-macrofunctie maken door deze code in macro te plaatsen? Iets als dit:
%macro nobs(dset=,result=); %global &result; data _null_; call symputx("&result",n); stop; set &dset Nobs=n; uitvoeren;%mend nobs;
het antwoord is “nee”. Ja, we hebben een geldige macro gemaakt; we kunnen deze macro aanroepen om het resultaat te produceren:
%nobs(dset=SASHELP.CARS, result = NOBS);%put &=NOBS; NOBS=428
maar dit is geen macrofunctie. Herinner je type 2 macro die geen SAS programmeertaal code genereert, alleen een waarde? Maar deze macro genereert wel SAS-code die een waarde toewijst aan de macro variabele die is opgegeven als het tweede argument (result=NOBS).
om een geldige macro-functie te maken, zou onze macro geen SAS-taalcode moeten bevatten-noch een DATA-stap, noch een PROC-stap. Het kan alleen bestaan uit de SAS macro taalcode. Hier is het:
%macro nobs(dset); %lokale dsid n; %laat dsid = %sysfunc(open(&dset)); %indien &dsid %dan %doen; %laat n = %sysfunc(attrn(&dsid,nlobs)); %laat dsid = %sysfunc(nabij(&dsid)); %end; %anders %plaats %sysfunc(sysmsg()); &n%mend nobs;
wanneer macro-processor deze macro uitvoert, is het enige object dat wordt doorgegeven aan de SAS-taalcompiler de waarde die wordt getoond in de regel vlak voor de %mend. Dit is de berekende waarde van het aantal waarnemingen (aangeduid met &n ). Dit is het enige dat zichtbaar is door de SAS language compiler, de rest is de macro taal code zichtbaar en wordt behandeld door SAS macro processor.
belangrijk: Gebruik bij het definiëren van de SAS-macrofunctie altijd %local statement om alle macrovariabelen te tonen die in uw macro zijn gemaakt om ervoor te zorgen dat ze niet per ongeluk dezelfde macrovariabelen overschrijven in de aanroepende omgeving. U hoeft %local niet te declareren voor macro parameters omdat deze altijd automatisch lokaal zijn.
SAS-macrofuncties gebruiksvoorbeelden
wanneer een macrofunctie op deze manier is gedefinieerd, overal waar u de aanroep %nobs plaatst(SASHELP.Auto ‘ s) in uw SAS-code zal worden geëvalueerd en vervangen door de bijbehorende waarde (in dit geval is het nummer 428) door de SAS macro processor. Op die manier kunt u ondermaatse hard-codering vermijden en uw SAS-code dynamisch en krachtig maken. U kunt macrofuncties gebruiken in veel SAS-coderingscontexten. Bijvoorbeeld:
- toewijzing statements voor macro variabele: % let NOBS= % nobs (SASHELP.CARS);
- toewijzing statement in een DATA stap: x = % nobs (SASHELP.CARS);
- als onderdeel van een expressie in een GEGEVENSSTAP: x = %nobs(SASHELP.CARS) /2 + 3;
- als een waarde van een DATA stap do lus: do i = 1 tot %nobs (SASHELP.CARS);
- als een waarde van een macro do-lus: % do &i=1% tot %nobs (SASHELP.CARS);
- als onderdeel van voorwaarde in IF statement: if % nobs (SASHELP.CARS) > 500 then do;
enzovoort. Het is belangrijk om op te merken dat argumenten (parameters) om macro functies moeten ofwel SAS constanten of macro-expressies oplossen naar SAS constanten. Aangezien macrofuncties door de macroprocessor worden opgelost voordat het SAS-programma wordt uitgevoerd, kunnen de argumenten geen variabelnamen zijn. Dit is het belangrijkste verschil tussen macro functies en SAS functies.
uw gedachten?
vindt u dit bericht nuttig? Gebruikt u SAS-macrofuncties? Kunt u andere gebruiksvoorbeelden voorstellen? Gelieve te delen met ons in de commentaren hieronder.