SAS purpur Macro Language giver SAS-programmører uhyre alsidighed og effektivitet i deres kodeudvikling. Det giver SAS-brugere mulighed for at modularisere programmeringskode med “en gang skrevet – mange gange brugt” komponenter og i mange tilfælde automatisk generere datadrevet SAS-kode.
relateret blogindlæg: Multifunktionel makrofunktion til at få oplysninger om datasæt
Makrosprog og makroprocessor
generelt behandler SAS – programmet dit SAS-program trin for trin, først scanner det efter makrosprogobjekter-makrovariabler refereret som&somename og makroer refereret som %somename. Hvis det findes, aktiverer SAS makroprocessor, som løser og erstatter disse makroreferencer i henhold til makrosprogssyntaksen, før SAS kompilerer og udfører dine programmeringstrin.
SAS macro language vs. SAS programmeringssprog
et SAS – program består normalt af to, ofte sammenvævede lag-makrolag og ikke-makrolag, hver med sin egen syntaks og sin egen timing for kompilering og udførelse. SAS-kode er med andre ord en kombination af to forskellige sprog:
- SAS programmeringssprog (bestående af DATATRIN, PROC-trin og globale udsagn som LIBNAME, optioner, titel osv.)
- SAS makrosprog (bestående af %LET, %IF, %DO, makrofunktioner osv.) som behandles separat fra og før SAS compiler udfører SAS programmeringssprogkode.
forskellen mellem dem er som en forskel mellem at lave et måltid og spise måltidet. I denne analogi måltid=kode, madlavning=SAS makro sprog, spise=SAS programmeringssprog. En klar forståelse af denne forskel er nøglen til at blive en succesfuld SAS-programmør.
to typer SAS-makroer
der er to forskellige typer SAS-makroer:
- makroer, der genererer nogle SAS-programmeringssprogskoder, der kan spænde over SAS-udsagn eller-trin;
- makroer, der genererer nogle strengværdier, der kan bruges som en del af SAS programmeringssprogkode eller dataværdier, men de er ikke komplette SAS-udsagn eller-trin. Denne type genererer ikke nogen SAS eksekverbar kode, bare en værdi.
Hvad er en SAS makrofunktion?
SAS makro funktion er en SAS Makro, der genererer en værdi. Det er med andre ord den type 2-Makro, der er beskrevet ovenfor. Som alle SAS-makroer kan SAS-makrofunktioner have et hvilket som helst antal (nul eller mere) af positionelle eller/og navngivne parametre (argumenter). SAS-brugere kan definere deres egne makrofunktioner, men ved at gøre det må du ikke bruge nogen SAS-sprogsyntaks; kun SAS-makrosprogssyntaks er tilladt. Du kan bruge eksisterende makrofunktioner i din egen makrofunktionsdefinition. Blandt andre er en af de mest magtfulde %SYSFUNC makrofunktion, der bringer et væld af SAS-sprogfunktioner til SAS-makrosprog.
kilder til SAS makrofunktioner
SAS makrofunktioner kan komme fra følgende tre kilder.
forudbyggede makrofunktioner
forudbyggede makrofunktioner, der er en del af makroprocessoren. Disse er sådanne makrofunktioner som %eval, %længde, %citat, %scan, %str, %sysfunc, %upcase osv. Her er en komplet liste over de forudbyggede SAS makrofunktioner.
Auto-call makrofunktioner
Auto-call makroer, nogle af dem er type 1 (makroer) og nogle – type 2 (makrofunktioner) som f.eks. Disse makrofunktioner supplerer de forudbyggede makrofunktioner. Hovedforskellen fra de forudbyggede makrofunktioner er, at makrofunktionerne automatisk opkald er programprøver af de brugerdefinerede makrofunktioner, der er skrevet på SAS makrosprog og gjort tilgængelige for dig uden at skulle definere eller inkludere dem i dine programmer. Automatisk opkald makro funktioner kommer med din SAS program installation og normalt forudkonfigureret for dig ved at indstille mautosource og sasautos= makro system muligheder. De kan omfatte flere makrobiblioteker afhængigt af de SAS-produkter, der er licenseret på din hjemmeside. For eksempel til min SAS BASE-installation er makrobiblioteket automatisk opkald i følgende mappe:
C:\Program filer\SASHome \ SASFoundation \ 9.4 \ core \ sasmacro
Her er en udvalgt liste over automatiske opkaldsmakroer, der leveres med SAS-programmer.
fra brugssynspunktet vil du ikke mærke nogen forskel mellem de forudbyggede og auto-call makrofunktioner. For eksempel er makrofunktionen %upcase() forudbygget, mens makrofunktionen %lavcase() er automatisk opkaldsmakrofunktion. De tilhører helt forskellige familier, men vi bruger dem som om de er komplementære søskende.
brugerdefinerede makrofunktioner
endelig er der brugerdefinerede makrofunktioner, der ikke følger med SAS-installation. Dette er de makrofunktioner, du definerer på egen hånd. Normalt holdes de adskilt fra de automatiske opkaldsmakroer hovedsageligt for at skelne dem fra SAS-leverede.
for at aktivere adgang til dit eget SAS-makrobibliotek ud over makrobiblioteket til automatisk opkald( eller biblioteker) kan du bruge indstillingen INSERT= system:
options insert=(sasautos=”path_to_your_macro_library_folder”);
i stedet for at erstatte sasautos-værdien indsætter denne indstilling en ekstra værdi i den eksisterende sasautos-indstilling som den første værdi, så du først kan trykke på dit eget makrobibliotek og derefter også i forudindstillede SAS auto-call-biblioteker.
oprettelse af brugerdefineret makrofunktion
lad os overveje følgende eksempel. Antag, at vi vil oprette en makrofunktion, der tager et datasætnavn som et argument og returnerer en værdi svarende til antallet af observationer i det datasæt.
Vi ved, at følgende kode beregner antallet af observationer i et datasæt:
data _null_; call symputks('NOBS',n); stop; sæt SASHELP.CARS nobs=n; run; %put &=NOBS;NOBS=428
kan vi oprette en SAS-makrofunktion ved at omslutte denne kode til makro? Noget som dette:
%macro nobs(dset=,resultat=); %global &resultat; data _null_; ring til symputeks("&resultat",n); stop; sæt &dset Nobs=n; Kør;%reparere nobs;
svaret er “nej”. Ja, vi oprettede en gyldig Makro; vi kan påkalde denne makro for at producere resultatet:
%nobs(dset=SASHELP.Biler, resultat=NOBS);%put &=NOBS; NOBS=428
men dette er ikke en makrofunktion. Husk type 2 Makro, der ikke genererer nogen SAS programmeringssprog kode, bare en værdi? Men denne makro genererer SAS-kode, der tildeler en værdi til den makrovariabel, der er angivet som det andet argument (resultat=NOBS).
for at oprette en gyldig makrofunktion skal vores Makro ikke have nogen SAS – sprogkode i den-hverken et DATATRIN eller et PROC-trin. Det kan kun bestå af SAS-makrosprogkoden. Her er det:
%macro nobs(dset); %lokal dsid n; %lad dsid = %sysfunc(åben(&dset)); %hvis &dsid %derefter %gør; %lad n = %sysfunc(attrn(&dsid,nlobs)); %lad dsid = %sysfunc(luk(&dsid)); %ende; %else %put %sysfunc(sysmsg()); &n%mend nobs;
Når makroprocessor udfører denne makro, er det eneste objekt, der sendes til SAS-sprogkompilatoren, den værdi, der vises i linjen lige før %mend. Dette er den beregnede værdi af antallet af observationer (betegnet med &n ). Dette er det eneste, der er synligt af SAS language compiler, resten er makrosprogkoden synlig og håndteres af SAS makroprocessor.
vigtigt: Når du definerer SAS makrofunktion, skal du altid bruge %lokal sætning til at liste alle makrovariabler, der oprettes i din Makro for at sikre, at de ikke ved et uheld overskriver samme navngivne makrovariabler i opkaldsmiljøet. Du behøver ikke at erklære %lokal for makroparametre, da de altid er lokale automatisk.
SAS makrofunktioner brugseksempler
Når en makrofunktion er defineret på denne måde, uanset hvor du placerer dens påkaldelse %nobs(SASHELP.Biler) i din SAS-kode vil den blive evalueret og erstattet med den tilsvarende værdi (i dette tilfælde er det nummer 428) af SAS-makroprocessoren. På den måde kan du undgå substandard hårdkodning og gøre din SAS-kode dynamisk og kraftfuld. Du kan bruge makrofunktioner i mange SAS-kodningssammenhænge. For eksempel:
- Tildelingsopgørelser for makrovariabel: %lad NOBS=%nobs(SASHELP.CARS);
- Opgaveerklæring i et DATATRIN: Nobs (SASHELP.CARS);
- som en del af et udtryk i et DATATRIN: sashelp.Biler)/2 + 3;
- som en værdi af et DATATRIN do loop: gør jeg=1 til %nobs (SASHELP.Biler);
- som en værdi af en makro Do loop: % gør & i=1% til %nobs(SASHELP.Biler);
- som en del af betingelsen i IF-erklæring: if %nobs(SASHELP.Biler) > 500 så gør;
og så videre. Det er vigtigt at bemærke, at argumenter (parametre) til makrofunktioner skal være enten SAS-konstanter eller makroudtryk, der løses til SAS-konstanter. Da makrofunktioner løses af makroprocessoren før SAS-programudførelse, kan argumenterne ikke være variabelnavne. Dette er den vigtigste forskel mellem makrofunktioner og SAS-funktioner.
dine tanker?
finder du dette indlæg nyttigt? Bruger du SAS makrofunktioner? Kan du foreslå andre brugseksempler? Del venligst med os i kommentarerne nedenfor.