Domanda

Nel mio codice ho diverse macro. Macro A è la macro principale. Macro Una macro quindi chiama B, che a sua volta chiama macro C.

In SAS, devo definirli in modo contrario? In altre parole, devo definire macro C, poi macro B, quindi macro Un ultimo? O cosa importa dal momento che SAS si legge tutto il codice nella prima che colpisca in realtà il comando per eseguire le macro? Del resto, posso eseguire il comando per eseguire la macro come la prima dichiarazione nel mio codice e quindi definire le macro sotto il comando?

Grazie!

È stato utile?

Soluzione

In primo luogo, è necessario definire una macro prima si chiama.

In secondo luogo, non importa dove la macro viene richiamato finché aver caricato prima mano.

Per approfondire il problema: La biblioteca di Monitoraggio è tuo amico. Se l'amministratore SAS non vi 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; 

Altri suggerimenti

una macro deve essere definito prima di essere chiamato. per motivi di prestazioni, è meglio non definire una macro all'interno di un altro - se lo fate, allora sarà ridefinita ogni volta che si chiama la macro esterno. 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
*/

È necessario definire una macro prima si chiama, in modo che la linea con "% A" avrebbe bisogno di seguire la definizione di macro A. L'ordine delle altre definizioni di macro non importa, fintanto che sono definiti prima che sono chiamati. In genere nei miei programmi ho creato una macro principale come lei descrive, quindi l'ultima riga del programma chiama questa macro.

Un'altra opzione da considerare è quello di istituire una biblioteca autochiamata macro, che contiene le definizioni di molti macro. Questo funziona meglio per le macro riutilizzabili, in modo che non c'è bisogno di ridefinire loro in ogni programma.

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

codice di macro:

Il codice di macro in sé è molto semplice in quanto quando si verifica il token %macro il sistema SAS inizia a compilare una macro SAS e mantiene la compilazione fino a raggiungere un gettone %mend. Gli unici veri problemi si può venire contro è che se hai aggiornato il codice di macro e non ricompilare esso prima di eseguirlo - in queste situazioni sarà ancora eseguito la vecchia versione che ha nella biblioteca macro. Per estensione, se si tenta di compilare una macro che chiama un'altra macro, che non sia già stato definito quindi 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: Quando si definisce macro variabili ci sono due ambiti: globale e locale. Una volta definiti, le variabili globali sono accessibili ovunque e in qualsiasi momento. Tuttavia, variabili locali esistono solo localmente durante l'esecuzione della macro in cui è stato definito. Per estensione, se la macro in cui è stata definita la variabile locale chiama altre macro, la variabile macro locale sarà ancora accessibile:

Esempio di funzionamento:

Nel seguente esempio, le macro sono definiti in ordine inverso per impedire SAS restituzione di un invocazione apparente di avvertimento macro .

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

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

Compila 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 ;

Compila la macro livello superiore (che a sua volta chiama queste 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 in sede di revisione del registro:

  • Al di fuori di Level3%, e mi restituisce un messaggio di avviso che la variabile macro fa non esiste
  • In% Level3, quando & G1 è chiamato, restituisce il valore memorizzato in l'ambito locale% level3.Once al di fuori del% Level3, il valore ritorna al valore memorizzato globalmente
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top