2009-02-11 42 views
6

Nel mio codice ho diverse macro. La macro A è la macro principale. La macro A chiama quindi la macro B che a sua volta chiama macro C.SAS: chiamata di una macro da un'altra ... Ordine delle definizioni macro

In SAS, devo definirli in ordine inverso? In altre parole, devo prima definire la macro C, quindi la macro B e infine la macro A? O è importante dal momento che SAS legge tutto il codice prima che colpisca effettivamente il comando per eseguire i macro? Del resto, posso impartire il comando per eseguire la macro come prima istruzione nel mio codice e quindi definire le macro sotto il comando?

Grazie!

risposta

3

Prima di tutto, è necessario definire una macro prima che venga chiamata.

In secondo luogo, non importa dove viene richiamata la macro finché è stata caricata in precedenza.

Per approfondire il problema: la libreria di autocall è tua amica. Se l'amministratore SAS non si permetterà di mettere le macro nella libreria di Monitoraggio, è possibile aggiungere l'autochiamata in questo modo:

filename mymacros 'c:\mysas'; 
/*this defines the directory you have stored your macros*/ 

options sasautos=(sasautos mymacros) mautosource; 
+0

Tecnicamente parlando, la libreria di autocall non carica 'before-hand' macro. Se l'utente tenta di eseguire una macro e quella macro non è già stata definita, allora SAS inizierà a cercarla nella libreria di autocall. Se trova correttamente un nome file che corrisponde alla chiamata e quel file contiene un nome di macro che corrisponde alla chiamata, solo allora compilerà la macro. Se si apportano modifiche a tale file nella libreria di autocall, sarà necessario inviare nuovamente il codice manualmente affinché tali modifiche diventino disponibili in una sessione SAS interattiva. –

1

È necessario definire una macro prima di chiamarla, pertanto la riga con "% A" deve seguire la definizione della macro A. L'ordine delle altre definizioni di macro non ha importanza, purché siano definite prima sono chiamati. Tipicamente nei miei programmi ho impostato una macro principale come la descrivi, quindi l'ultima riga del programma chiama questa macro.

Un'altra opzione da considerare è impostare una libreria di macro autocall, che contiene le definizioni di molte macro. Questo funziona meglio per i macro riutilizzabili, in modo che non sia necessario ridefinirli in ogni programma.

3

una macro deve essere definito prima di essere chiamato. per motivi di prestazioni, è meglio non definire una macro all'interno di un'altra: se lo fai, verrà ridefinita ogni volta che chiami la macro esterna. le seguenti opere di bene:

%macro a; 
    %put a; 
    %b 
%mend a; 

%macro b; 
    %put b; 
    %c 
%mend b; 

%macro c; 
    %put c; 
%mend c; 

%*-- %a is main --*; 
%a 
/* on log 
a 
b 
c 
*/ 
0

Ci sono due aspetti di codice di macro in SAS da definire: il codice della macro che viene compilato e i parametri macro:

codice macro:

Il il codice macro stesso è molto semplice in quanto quando si incontra il token %macro, il sistema SAS inizia a compilare una macro SAS e continua a compilare finché non raggiunge un token %mend. L'unico vero problema che si può incontrare è se si aggiorna il codice macro e non lo si ricompila prima di eseguirlo - in queste situazioni verrà comunque eseguita la vecchia versione che ha nella libreria delle macro. Per estensione, se si tenta di compilare una macro che chiama un'altra macro che non è già stata definita, si otterrà un errore. Per questi motivi, devono essere programmate nell'ordine in cui essi sono chiamati (come mostrato nell'esempio di seguito:% level3 viene prima% level2, che viene prima% level1)

variabili macro: Nel definire macro variabili ci sono due ambiti: Globale e Locale. Una volta definite, le variabili globali sono accessibili ovunque e in qualsiasi momento. Tuttavia, le variabili locali esistono solo localmente durante l'esecuzione della macro in cui è stata definita.Per estensione, se la macro in cui è stata definita la variabile locale chiama altre macro, la variabile macro locale sarà ancora accessibile:

di lavoro Esempio:

Nel seguente esempio, le macro sono definite, in ordine inverso per impedire a SAS di restituire un avviso apparente della macro.

Lo schema seguente illustra la struttura dei seguenti macro nel seguente esempio:

|-----------------------------| 
|GLOBAL      | 
| |------------------------| | 
| |LEVEL1     | | 
| | |-------------------| | | 
| | |LEVEL2    | | | 
| | | |--------------| | | | 
| | | | LEVEL3  | | | | 
| | | |--------------| | | | 
| | |-------------------| | | 
| |------------------------| | 
|-----------------------------| 

Compilare le macro nidificate:

%macro level3 ; 
    %put **** START LEVEL3 **** ; 
    %local G1; 
    %let G1=Local ; 

    %do i=1 %to 2 ; 
    %put In the macro do loop I=&i ; 
    %end ; 

    %put The value of I at level3 is: &I ; 
    %put Are we accessing global or local G1 variable here: &G1 ; 

    %put **** END LEVEL3 ****; 
%mend level3 ; 


%macro level2 ; 
    %put **** START LEVEL2 **** ; 
    %*global L1 ; *<-- this would produce an error because the variable name has already been added to the local scope in %level1 ; 

    %put Are we accessing global or local G1 variable here: &G1 ; 
    %put Can we access local variables here: &L1 ; 

    %level3 ; 

    %put The value of I in level2 is: &I ; 
    %put **** END LEVEL2 ****; 
%mend level2 ; 

compilazione macro livello superiore (che a sua volta richiama il sopra due macro) ed eseguirlo:

%let G1=Global; 
%macro level1 ; 
    %put **** START LEVEL1 **** ; 
    %let L1=Yes; 

    %put Are we accessing global or local G1 variable here: &G1 ; 
    %put Can we access local variables here: &L1 ; 

    %level2 ; 

    %put The value of I outside of the local macro is: &I ; 
    %put Are we accessing global or local G1 variable here: &G1 ; 

    %put **** END LEVEL1 ****; 
%mend level1 ; 
%level1 ; 

Punti da notare durante la revisione di e registro:

  • Al di fuori di% Level3, & mi restituisce un avviso che la variabile macro non non esiste
  • All'interno% Level3, quando & G1 viene chiamato, restituisce il valore memorizzato in l'ambito locale di% level3.Un'esterno di% level3, il valore restituisce al valore memorizzato globalmente
Problemi correlati