bloguri

funcția macro SAS

limbajul Macro SAS imens împuternicește programatorii SAS cu versatilitate și eficiență a dezvoltării codului lor. Permite utilizatorilor SAS să modularizeze codul de programare cu componente” o dată scrise-de multe ori folosite” și, în multe cazuri, să genereze automat codul SAS bazat pe date.

legate de blog post: Funcție macro multifuncțională pentru obținerea de informații despre seturile de date

limbaj Macro și procesor macro

În general, software – ul SAS procesează programul SAS pas cu pas, scanându-l mai întâi pentru obiecte de limbaj macro-variabile macro denumite&somename și macrocomenzi denumite %somename. Dacă este găsit, software-ul SAS activează procesorul macro care rezolvă și înlocuiește acele referințe macro în funcție de sintaxa limbajului macro înainte ca SAS să compileze și să execute pașii de programare.

limbajul macro SAS vs. Limbajul de programare SAS

un program SAS constă de obicei din două straturi, adesea întrețesute – strat macro și strat non-macro, fiecare cu propria sintaxă și propriul calendar de compilare și execuție. Cu alte cuvinte, codul SAS este o combinație de două limbi distincte:

  • limbajul de programare SAS (format din pași de date, pași PROC și declarații globale precum LIBNAME, opțiuni, titlu etc.)
  • limbajul macro SAS (format din %LET, %IF, %DO, funcții macro etc.) care este procesat separat de și înainte ca compilatorul SAS să execute codul limbajului de programare SAS.

diferența dintre ele este ca o diferență între a găti o masă și a mânca masa. În această analogie meal = code, cooking = SAS macro language, eating = SAS programming language. Înțelegerea clară a acestei diferențe este cheia pentru a deveni un programator SAS de succes.

două tipuri de macrocomenzi SAS

există două tipuri distincte de macrocomenzi SAS:

  1. macrocomenzi care generează un cod de limbaj de programare SAS care se poate întinde pe instrucțiuni sau pași SAS;
  2. macrocomenzi care generează unele valori de șir care pot fi utilizate ca parte a codului limbajului de programare SAS sau a valorilor de date, dar nu sunt instrucțiuni sau pași SAS complete. Acest tip nu generează niciun cod executabil SAS, ci doar o valoare.

ce este o funcție macro SAS?

funcția macro SAS este o macrocomandă SAS care generează o valoare. Cu alte cuvinte, este macro-ul de tip 2 descris mai sus. Ca orice macro-uri SAS, funcțiile macro SAS pot avea orice număr (zero sau mai mult) de parametri poziționali sau/și numiți (argumente). Utilizatorii SAS își pot defini propriile funcții macro, dar în acest sens nu puteți utiliza nicio sintaxă de limbă SAS; este permisă numai sintaxa limbajului macro SAS. Puteți utiliza funcțiile macro existente în propria definiție a funcției macro. Printre altele, una dintre cele mai puternice este funcția macro %sysfunc, care aduce o multitudine de funcții de limbaj SAS în limbajul macro SAS.

sursele funcțiilor macro SAS

funcțiile macro SAS pot proveni din următoarele trei surse.

funcții macro pre-construite

funcții macro pre-construite care fac parte din procesorul macro. Acestea sunt funcții macro precum % eval, %length, %quote, %scan, %str, %sysfunc, % upcase etc. Iată o listă completă a funcțiilor macro SAS pre-construite.

funcții macro auto-apel

macro-uri auto – apel, unele dintre ele sunt de tip 1 (macro-uri), iar unele-tip 2 (funcții macro), cum ar fi %cmpres, %stânga, %lowcase, %trim, %verifica, etc. Aceste funcții macro completează funcțiile macro pre-construite. Principala diferență față de funcțiile macro pre-construite este că funcțiile macro Auto-call sunt mostre de programe ale funcțiilor macro definite de utilizator care sunt scrise în limbajul macro SAS și puse la dispoziția dvs. fără a fi nevoie să le definiți sau să le includeți în programele dvs. Funcțiile macro de apel automat vin cu instalarea software-ului SAS și, de obicei, pre-configurate pentru dvs. prin setarea opțiunilor MAUTOSOURCE și SASAUTOS= macro system. Acestea pot include mai multe biblioteci macro, în funcție de produsele SAS licențiate pe site-ul dvs. De exemplu, pentru instalarea bazei mele SAS, biblioteca de macro-uri pentru apeluri automate se află în următorul folder:

C:\Program fișiere \ Sashome \ SASFoundation \ 9.4 \ core \ sasmacro

aici este o listă selectată de macro-uri auto-apel furnizate cu software-ul SAS.

Din punct de vedere al utilizării, nu veți observa nicio diferență între funcțiile macro pre-construite și cele de apel automat. De exemplu, funcția macro %upcase() este pre-construit, în timp ce funcția macro %lowcase() este funcția macro auto-apel. Ele aparțin unor familii complet diferite, dar le folosim ca și cum ar fi frați complementari.

funcții macro definite de utilizator

În cele din urmă, există funcții macro definite de utilizator care nu vin cu instalarea SAS. Acestea sunt funcțiile macro pe care le definiți pe cont propriu. De obicei, acestea sunt păstrate separat de macro-urile de apel automat, în principal pentru a le distinge de cele furnizate de SAS.

pentru a permite accesul la propria bibliotecă macro SAS în plus față de Biblioteca macro auto-apel (sau biblioteci), puteți utiliza opțiunea INSERT = system:
opțiuni insert=(sasautos = „path_to_your_own_macro_library_folder”);

în loc să înlocuiască valoarea SASAUTOS, această opțiune introduce o valoare suplimentară în opțiunea SASAUTOS existentă ca primă valoare, permițându-vă astfel să atingeți mai întâi propria bibliotecă macro și apoi, de asemenea, în bibliotecile de apeluri automate SAS prestabilite.

crearea funcției macro definite de utilizator

să luăm în considerare următorul exemplu. Să presupunem că dorim să creăm o funcție macro care ia un nume de set de date ca argument și returnează o valoare egală cu numărul de observații din acel set de date.

știm că următorul cod calculează numărul de observații într-un set de date:

data _null_; apel symputx('NOBS',n); stop; set SASHELP.Masini nobs = n; alerga; % pune &=NOBS;NOBS=428

putem crea o funcție Macro SAS prin anexând acest cod în macro? Ceva de genul:

%Macro nobs(dset=,result=); %global &rezultat; date _null_; apel symputx("&rezultat",n); stop; set &dset Nobs=n; alerga;% mend nobs;

răspunsul este „nu”. Da, am creat o macrocomandă validă; putem invoca această macrocomandă pentru a produce rezultatul:

%nobs(dset=SASHELP.Mașini, rezultat = NOBS);%pune &=NOBS; NOBS=428

dar aceasta nu este o funcție macro. Amintiți-vă de tip 2 macro care nu generează nici un cod de limbaj de programare SAS, doar o valoare? Dar acest macro generează cod SAS care atribuie o valoare variabilei macro specificate ca al doilea argument (rezultat=NOBS).

pentru a crea o funcție Macro validă, macrocomanda noastră nu ar trebui să aibă niciun cod de limbă SAS în ea – nici un pas de date, nici un pas PROC. Acesta poate fi compus numai din Codul de limbă macro SAS. Aici este:

%Macro nobs(dset); %local dsid n; %lasa dsid = %sysfunc(deschis(&dset)); %dacă &dsid %atunci %do; %let n = %sysfunc(attrn(&DSID,nlobs)); %let DSID = %sysfunc(close(&DSID)); %end; %else %put %sysfunc(sysmsg()); &n%mend nobs;

când procesorul macro execută această macrocomandă, singurul obiect care este transmis compilatorului de limbă SAS este valoarea afișată în linie chiar înainte de %mend. Aceasta este valoarea calculată a numărului de observații (notată cu &n ). Acesta este singurul lucru care este vizibil de compilatorul de limbi SAS, restul este codul de limbă macro vizibil și gestionat de procesorul macro SAS.

IMPORTANT: Când definiți funcția macro SAS utilizați întotdeauna instrucțiunea % local pentru a lista toate variabilele macro create în macrocomanda dvs. pentru a vă asigura că nu vor suprascrie accidental variabilele macro cu același nume în mediul de apelare. Nu trebuie să declarați %local pentru parametrii macro, deoarece aceștia sunt întotdeauna locali automat.

Exemple de utilizare a funcțiilor macro SAS

când o funcție macro este definită în acest fel, oriunde plasați invocarea %nobs(sashelp.SAS va fi evaluat și înlocuit cu valoarea corespunzătoare (în acest caz este numărul 428) de către procesorul macro SAS. În acest fel puteți evita substandard greu de codificare și de a face codul SAS dinamic și puternic. Puteți utiliza funcții macro în multe contexte de codificare SAS. De exemplu:

  • instrucțiuni de atribuire pentru variabila macro: %să NOBS=%nobs(SASHELP.Mașini);
  • declarație de atribuire într-un pas de date: x = %nobs(SASHELP.Mașini);
  • ca parte a unei expresii într-un pas de date: x = %nobs(SASHELP.Mașini) / 2 + 3;
  • ca valoare a unui pas de date face buclă: do I = 1 la % nobs (SASHELP.Mașini);
  • ca valoare a unei bucle macro do: %do&i=1% la %nobs(SASHELP.Mașini);
  • ca parte a condiției din declarația IF: if %nobs(SASHELP.CARS) > 500 apoi face;

și așa mai departe. Este important să rețineți că argumentele (parametrii) funcțiilor macro trebuie să fie constante SAS sau expresii macro care rezolvă constante SAS. Deoarece funcțiile macro sunt rezolvate de procesorul macro înainte de executarea programului SAS, argumentele nu pot fi nume de variabile. Aceasta este diferența cheie dintre funcțiile macro și funcțiile SAS.

gândurile tale?

vi se pare utilă această postare? Utilizați funcții macro SAS? Puteți sugera alte exemple de utilizare? Vă rugăm să împărtășiți cu noi în comentariile de mai jos.

Lasă un răspuns

Adresa ta de email nu va fi publicată.