bloggar

SAS Makro funktion

SAS Slovakiska Makro språk ger oerhört SAS programmerare med mångsidighet och effektivitet i deras kodutveckling. Det gör det möjligt för SAS-användare att modularisera programmeringskod med” once written – many times used ” -komponenter och genererar i många fall automatiskt datadriven SAS-kod.

relaterat blogginlägg: Multi-purpose Makro funktion för att få information om datamängder

Makro språk och makro processor

generellt SAS programvara bearbetar SAS program Steg för steg, först skanna den för Makro språkobjekt – makrovariabler refererade som &somename, och makron refererade som %somename. Om den hittas aktiverar SAS programvara makroprocessor som löser och ersätter dessa makroreferenser enligt makrospråksyntaxen innan SAS kompilerar och kör dina programmeringssteg.

SAS makrospråk vs. SAS programmeringsspråk

ett SAS-program består vanligtvis av två, ofta sammanvävda lager – makrolager och icke-makrolager, var och en med sin egen syntax och sin egen tidpunkt för sammanställning och körning. Med andra ord är SAS-kod en kombination av två distinkta språk:

  • SAS programmeringsspråk (bestående av datasteg, PROC-steg och globala uttalanden som LIBNAME, OPTIONS, TITLE etc.)
  • SAS makrospråk (består av %LET, % IF, % DO, makrofunktioner etc.) som behandlas separat från och innan SAS compiler kör SAS programmeringsspråk kod.

skillnaden mellan dem är som en skillnad mellan att laga en måltid och äta måltiden. I denna analogi måltid=kod, matlagning=SAS Makro språk, äta=SAS programmeringsspråk. Tydlig förståelse för denna skillnad är nyckeln till att bli en framgångsrik SAS-programmerare.

två typer av SAS makron

det finns två olika typer av SAS makron:

  1. makron som genererar vissa SAS programmeringsspråk kod som kan spänna över SAS uttalanden eller steg;
  2. makron som genererar vissa strängvärden som kan användas som en del av SAS programmeringsspråkskod eller datavärden, men de är inte fullständiga SAS-satser eller steg. Denna typ genererar inte någon SAS körbar kod, bara ett värde.

vad är en SAS makrofunktion?

SAS makrofunktion är ett SAS-makro som genererar ett värde. Med andra ord är det typ 2-makrot som beskrivs ovan. Som alla SAS-makron kan SAS-makrofunktioner ha valfritt antal (noll eller mer) positions-eller/och namngivna parametrar (argument). SAS-användare kan definiera sina egna makrofunktioner, men på så sätt får du inte använda någon SAS-språksyntax; endast SAS-Makro-språksyntax är tillåten. Du kan använda befintliga makrofunktioner i din egen makrofunktion definition. Bland annat är en av de mest kraftfulla %SYSFUNC makrofunktion som ger en mängd SAS-språkfunktioner till SAS makrospråk.

källor till SAS makrofunktioner

SAS makrofunktioner kan komma från följande tre källor.

förbyggda makrofunktioner

förbyggda makrofunktioner som ingår i makroprocessorn. Dessa är sådana makrofunktioner som %eval, % length, %quote, %scan, %str, %sysfunc, %upcase, etc. Här är en komplett lista över de förbyggda SAS-makrofunktionerna.

Auto-call Makro funktioner

Auto-call makron, några av dem är typ 1 (makron) och vissa – typ 2 (makrofunktioner) som %cmpres, %vänster, %lowcase, %trim, %verifiera, etc. Dessa makrofunktioner kompletterar de förbyggda makrofunktionerna. Huvudskillnaden från de förbyggda makrofunktionerna är att makrofunktionerna för automatisk samtal är programprover av de användardefinierade makrofunktionerna som skrivs i SAS makrospråk och görs tillgängliga för dig utan att behöva definiera eller inkludera dem i dina program. Auto-call Makro funktioner kommer med din SAS programinstallation och oftast förkonfigurerad för dig genom att ställa mautosource och SASAUTOS= macro systemalternativ. De kan innehålla flera makrobibliotek beroende på vilka SAS-produkter som är licensierade på din webbplats. Till exempel för min SAS-BASINSTALLATION finns makrobiblioteket för automatisk samtal i följande mapp:

C:\Program Files\SASHome\SASFoundation\9.4\core\sasmacro

Här är en vald lista över Auto-call makron som medföljer SAS programvara.

ur användningssynpunkt kommer du inte att märka någon skillnad mellan de förbyggda och de automatiska anropsmakrofunktionerna. Till exempel är makrofunktionen %upcase() förbyggd, medan makrofunktionen %lowcase() är makrofunktion för automatisk samtal. De tillhör helt olika familjer, men vi använder dem som om de är kompletterande syskon.

användardefinierade makrofunktioner

slutligen finns det användardefinierade makrofunktioner som inte kommer med SAS-installation. Det här är de makrofunktioner som du definierar på egen hand. Vanligtvis hålls de separat från de automatiska samtalsmakronerna, främst för att skilja dem från SAS-levererade.

för att aktivera åtkomst till ditt eget SAS-makrobibliotek utöver makrobiblioteket för automatisk samtal (eller bibliotek) kan du använda alternativet Infoga= system:
alternativ infoga=(sasautos= ”path_to_your_own_macro_library_folder”);

istället för att ersätta sasautos-värdet infogar det här alternativet ett extra värde i det befintliga sasautos-alternativet som det första värdet, vilket gör att du kan utnyttja ditt eget makrobibliotek först och sedan också i förinställda SAS auto-call-bibliotek.

skapa användardefinierad makrofunktion

låt oss överväga följande exempel. Antag att vi vill skapa en makrofunktion som tar ett datamängdsnamn som ett argument och returnerar ett värde som är lika med antalet observationer i den datamängden.

vi vet att följande kod beräknar antalet observationer i en datamängd:

data _null_; Ring symputx('NOBS',n); stopp; Ställ in SASHELP.Bilar nobs = n; kör; % put & = NOBS; NOBS = 428

kan vi skapa en SAS-makrofunktion genom att bifoga denna kod till Makro? Något så här:

%Makro nobs(dset=,result=); %global &resultat; data _null_; Ring symputx("&resultat",n); stopp; Ställ in &dset Nobs=n; kör;%mend nobs;

svaret är ”nej”. Ja, Vi skapade ett giltigt Makro; vi kan anropa detta makro för att producera resultatet:

%nobs(dset = SASHELP.Bilar, resultat = NOBS); % put &=NOBS;NOBS=428

men detta är inte en makrofunktion. Kom ihåg typ 2 makro som inte genererar någon SAS programmeringsspråk kod, bara ett värde? Men detta makro genererar SAS-kod som tilldelar ett värde till makrovariabeln som anges som det andra argumentet (resultat=NOBS).

för att skapa en giltig makrofunktion bör vårt Makro inte ha någon SAS – språkkod i den-varken ett DATASTEG eller ett PROC-steg. Den får endast bestå av SAS makrospråkskod. Här är det:

%Makro nobs(dset); %lokal dsid n; %låt dsid = %sysfunc(öppen(&dset)); %om &dsid %då %gör; %låt n = %sysfunc(attrn(&DSID,nlobs)); %låt DSID = %sysfunc(stäng(&dsid)); %slutet; %annat %sätta %sysfunc(sysmsg()); &n%mend nobs;

När makroprocessorn kör detta makro är det enda objektet som skickas till SAS-språkkompilatorn värdet som visas i raden precis före %mend. Detta är det beräknade värdet av antalet observationer (betecknad med &n ). Detta är det enda som syns av SAS-språkkompilatorn, resten är makrospråkskoden synlig och hanteras av SAS-makroprocessorn.

viktigt: När du definierar SAS makrofunktion använder du alltid %local statement för att lista alla makrovariabler som skapas i ditt makro för att säkerställa att de inte av misstag skriver över samma namngivna makrovariabler i den anropande miljön. Du behöver inte deklarera %lokalt för makroparametrar eftersom de alltid är lokala automatiskt.

SAS makrofunktioner användningsexempel

När en makrofunktion definieras på detta sätt, var du än placerar dess anrop %nobs(SASHELP.Bilar) i din SAS-kod kommer den att utvärderas och ersättas med motsvarande värde (i det här fallet är det nummer 428) av SAS-makroprocessorn. På så sätt kan du undvika undermålig hårdkodning och göra din SAS-kod dynamisk och kraftfull. Du kan använda makrofunktioner i många SAS-kodande sammanhang. Till exempel:

  • Tilldelningssatser för makrovariabel: %let NOBS=%nobs(SASHELP.CARS);
  • Tilldelningssats i ett datasteg: x = %nobs(SASHELP.Bilar);
  • som en del av ett uttryck i ett DATASTEG: x = %nobs(SASHELP.Bilar) / 2 + 3;
  • som ett värde för en datasteg gör loop: gör jag=1 till %nobs(SASHELP.CARS);
  • som ett värde för en Makro Do loop: %do &i=1% till %nobs(SASHELP.Bilar);
  • som en del av villkoret i IF uttalande: om %nobs(SASHELP.Bilar) > 500 gör sedan;

och så vidare. Det är viktigt att notera att argument (parametrar) till makrofunktioner måste vara antingen SAS-konstanter eller makrouttryck som löser SAS-konstanter. Eftersom makrofunktioner löses av makroprocessorn före SAS-programkörning kan argumenten inte vara variabelnamn. Detta är den viktigaste skillnaden mellan makrofunktioner och SAS-funktioner.

dina tankar?

tycker du att det här inlägget är användbart? Använder du SAS makrofunktioner? Kan du föreslå andra användningsexempel? Vänligen dela med oss i kommentarerna nedan.

Lämna ett svar

Din e-postadress kommer inte publiceras.