SAS® Macro Language consente immensamente ai programmatori SAS la versatilità e l’efficienza del loro sviluppo del codice. Consente agli utenti SAS di modulare il codice di programmazione con componenti” una volta scritti – molte volte usati ” e in molti casi genera automaticamente codice SAS basato sui dati.
Post sul blog correlato: Funzione macro multiuso per ottenere informazioni sui set di dati
Linguaggio macro e processore macro
Generalmente, il software SAS elabora il programma SAS passo dopo passo, prima di scansionarlo per gli oggetti del linguaggio macro – variabili macro a cui fa riferimento&somename e macro a cui fa riferimento %somename. Se trovato, SAS software attiva processore macro che risolve e sostituisce tali riferimenti macro in base alla sintassi del linguaggio macro prima SAS compila ed esegue i passaggi di programmazione.
Linguaggio macro SAS vs. Linguaggio di programmazione SAS
Un programma SAS di solito è costituito da due livelli, spesso intrecciati – livello macro e livello non macro, ognuno con la propria sintassi e la propria tempistica di compilazione ed esecuzione. In altre parole, il codice SAS è una combinazione di due linguaggi distinti:
- Linguaggio di programmazione SAS (composto da passaggi DATI, passaggi PROC e istruzioni globali come LIBNAME, OPZIONI, TITOLO ecc.)
- Linguaggio macro SAS (composto da %LET, %IF, % DO, funzioni macro ecc.) che viene elaborato separatamente da e prima che il compilatore SAS esegua il codice del linguaggio di programmazione SAS.
La differenza tra loro è come una differenza tra cucinare un pasto e mangiare il pasto. In questa analogia pasto = codice, cooking = SAS macro language, eating=SAS linguaggio di programmazione. Una chiara comprensione di questa differenza è la chiave per diventare un programmatore SAS di successo.
Due tipi di macro SAS
Esistono due tipi distinti di macro SAS:
- macro che generano un codice del linguaggio di programmazione SAS che può estendersi su istruzioni o passaggi SAS;
- Macro che generano alcuni valori di stringa che possono essere utilizzati come parte del codice del linguaggio di programmazione SAS o dei valori dei dati, ma non sono istruzioni o passaggi SAS completi. Questo tipo non genera alcun codice eseguibile SAS, solo un valore.
Che cos’è una funzione macro SAS?
La funzione macro SAS è una macro SAS che genera un valore. In altre parole, è la macro di tipo 2 descritta sopra. Come tutte le macro SAS, le funzioni macro SAS possono avere qualsiasi numero (zero o più) di parametri posizionali o/e denominati (argomenti). Gli utenti SAS possono definire le proprie funzioni macro, ma in tal modo non è possibile utilizzare alcuna sintassi del linguaggio SAS; è consentita solo la sintassi del linguaggio macro SAS. È possibile utilizzare le funzioni macro esistenti nella propria definizione di funzione macro. Tra gli altri, uno dei più potenti è %SYSFUNC macro function che porta una vasta gamma di funzioni del linguaggio SAS in SAS macro language.
Fonti di funzioni macro SAS
Le funzioni macro SAS possono provenire dalle seguenti tre fonti.
Funzioni macro predefinite
Funzioni macro predefinite che fanno parte del processore macro. Queste sono funzioni macro come % eval, % length, %quote, %scan, %str, %sysfunc, % upcase, ecc. Ecco un elenco completo delle funzioni macro SAS pre-costruite.
Funzioni macro di chiamata automatica
macro di chiamata automatica, alcune delle quali sono di tipo 1 (macro) e alcune di tipo 2 (funzioni macro) come %cmpres, %left, %lowcase, %trim, %verify, ecc. Queste funzioni macro completano le funzioni macro pre-costruite. La differenza principale rispetto alle funzioni macro predefinite è che le funzioni macro di chiamata automatica sono esempi di programma delle funzioni macro definite dall’utente che sono scritte in linguaggio macro SAS e rese disponibili senza doverle definire o includere nei programmi. Le funzioni macro di chiamata automatica vengono fornite con l’installazione del software SAS e di solito preconfigurate per l’utente impostando le opzioni di sistema MAUTOSOURCE e SASAUTOS= macro. Possono includere diverse librerie di macro a seconda dei prodotti SAS concessi in licenza sul tuo sito. Ad esempio, per l’installazione della mia base SAS, la libreria di macro di chiamata automatica si trova nella seguente cartella:
C:\Program Files \ SASHome \ SASFoundation \ 9.4\core \ sasmacro
Ecco un elenco selezionato di macro di chiamata automatica fornite con il software SAS.
Dal punto di vista dell’utilizzo, non si noterà alcuna differenza tra le funzioni macro pre-costruite e quelle di chiamata automatica. Ad esempio, la funzione macro %upcase() è pre-costruita, mentre la funzione macro %lowcase() è la funzione macro di chiamata automatica. Appartengono a famiglie completamente diverse, ma li usiamo come se fossero fratelli complementari.
Funzioni macro definite dall’utente
Infine, ci sono funzioni macro definite dall’utente che non vengono fornite con l’installazione SAS. Queste sono le funzioni macro che definisci da solo. Di solito, sono tenuti separatamente dalle macro di chiamata automatica principalmente per distinguerli da quelli forniti da SAS.
Per abilitare l’accesso alla propria libreria di macro SAS oltre alla libreria (o librerie) di macro a chiamata automatica, è possibile utilizzare l’opzione INSERT= system:
opzioni insert = (sasautos= “path_to_your_own_macro_library_folder”);
Invece di sostituire il valore SASAUTOS, questa opzione inserisce un valore aggiuntivo nell’opzione SASAUTOS esistente come primo valore, consentendo così di attingere prima alla propria libreria di macro e poi anche alle librerie di chiamate automatiche SAS preimpostate.
Creazione della funzione macro definita dall’utente
Consideriamo il seguente esempio. Supponiamo di voler creare una funzione macro che prende un nome di set di dati come argomento e restituisce un valore uguale al numero di osservazioni in quel set di dati.
Sappiamo che il seguente codice calcola il numero di osservazioni in un set di dati:
data _null_; call symputx('NOBS',n); stop; set SASHELP.CARS nobs = n; run; % put & = NOBS; NOBS=428
Possiamo creare una funzione macro SAS racchiudendo questo codice in macro? Qualcosa del genere:
%macro nobs(dset=,result=); %global&result; data _null_; call symputx ("&result",n); stop; set& dset nobs=n; esegui;%mend nobs;
La risposta è “No”. Sì, abbiamo creato una macro valida; possiamo invocare questa macro per produrre il risultato:
%nobs(dset=SASHELP.CARS, result = NOBS);%put &=NOBS;NOBS=428
Ma questa non è una funzione macro. Ricorda la macro di tipo 2 che non genera alcun codice del linguaggio di programmazione SAS, solo un valore? Ma questa macro genera codice SAS che assegna un valore alla variabile macro specificata come secondo argomento (result=NOBS).
Per creare una funzione macro valida, la nostra macro non dovrebbe avere alcun codice linguaggio SAS in esso – né un passo DATI, né un passo PROC. Può essere composto solo dal codice del linguaggio macro SAS. Qui è:
%macro nobs(dset); %locale dsid n; %lasciare dsid = %sysfunc(aperto(&dset)); %se &dsid %quindi %fare; %sia n = %sysfunc(attrn(&dsid,nlobs)); %lasciare dsid = %sysfunc(close(&dsid)); %end; %else %mettere %sysfunc(sysmsg()); &n%mend nobs;
Quando il processore macro esegue questa macro, l’unico oggetto che viene passato al compilatore del linguaggio SAS è il valore mostrato nella riga immediatamente prima di %mend. Questo è il valore calcolato del numero di osservazioni (indicato con & n ). Questa è l’unica cosa che è visibile dal compilatore del linguaggio SAS, il resto è il codice del linguaggio macro visibile e gestito dal processore macro SAS.
IMPORTANTE: Quando si definisce la funzione macro SAS, utilizzare sempre l’istruzione % local per elencare TUTTE le variabili macro create nella macro per assicurarsi che non sovrascrivano accidentalmente le variabili macro con lo stesso nome nell’ambiente chiamante. Non è necessario dichiarare % local per i parametri macro in quanto sono sempre locali automaticamente.
Funzioni macro SAS esempi di utilizzo
Quando una funzione macro è definita in questo modo, ovunque si posiziona la sua invocazione %nobs(SASHELP.AUTO) nel codice SAS verrà valutato e sostituito con il valore corrispondente (in questo caso è il numero 428) dal processore macro SAS. In questo modo puoi evitare l’hard-coding scadente e rendere il tuo codice SAS dinamico e potente. È possibile utilizzare le funzioni macro in molti contesti di codifica SAS. Ad esempio:
- Istruzioni di assegnazione per la variabile macro: %let NOBS=%nobs(SASHELP.AUTO);
- Istruzione di assegnazione in un passaggio DATI: x = % nobs (SASHELP.CARS);
- Come parte di un’espressione in un passaggio DATI: x = %nobs(SASHELP.AUTO)/2 + 3;
- Come valore di un passaggio DATI fare loop: devo=1 a % nobs (SASHELP.CARS);
- Come valore di una macro do loop: %do & i=1% a %nobs(SASHELP.AUTO);
- Come parte della condizione nella dichiarazione IF: if % nobs (SASHELP.AUTO) > 500 poi fare;
E così via. È importante notare che gli argomenti (parametri) delle funzioni macro devono essere costanti SAS o espressioni macro che si risolvono in costanti SAS. Poiché le funzioni macro vengono risolte dal processore macro prima dell’esecuzione del programma SAS, gli argomenti non possono essere nomi di variabili. Questa è la differenza fondamentale tra le funzioni macro e le funzioni SAS.
I tuoi pensieri?
Trovi questo post utile? Usi le funzioni macro SAS? Puoi suggerire altri esempi di utilizzo? Si prega di condividere con noi nei commenti qui sotto.