2009-02-11 46 views
6

En mi código tengo varias macros. Macro A es la macro principal. A continuación, la macro A llama a la macro B, que a su vez llama a macro C.SAS: Llamar a una macro de otra ... Orden de las definiciones de macro

En SAS, ¿tengo que definirlos en orden inverso? En otras palabras, ¿tengo que definir macro C primero, luego macro B, luego macro A último? ¿O importa ya que SAS lee todo el código antes de que llegue al comando para ejecutar las macros? Para el caso, ¿puedo emitir el comando para ejecutar la macro como la primera declaración en mi código y luego definir las macros debajo del comando?

Gracias!

Respuesta

3

Primero, debe definir una macro antes de llamarla.

En segundo lugar, no importa dónde se invoca la macro, siempre que la haya cargado previamente.

Para explicar su problema: La biblioteca de llamada automática es su amigo. Si el administrador SAS no se permitirá poner sus macros en la biblioteca autocall, puede anexar la autocall así:

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

options sasautos=(sasautos mymacros) mautosource; 
+0

Técnicamente hablando, la biblioteca de llamada automática no carga las macros 'de antemano'. Si el usuario intenta ejecutar una macro y esa macro aún no se ha definido, entonces SAS comenzará a buscarla en la biblioteca de llamada automática. Si encuentra con éxito un nombre de archivo que coincida con la llamada, y ese archivo contiene un nombre de macro que coincida con la llamada, solo entonces compilará la macro. Si luego realiza cambios en ese archivo en la biblioteca de llamada automática, deberá volver a enviar el código manualmente para que esos cambios estén disponibles en una sesión SAS interactiva. –

1

Debe definir una macro antes de llamarla, por lo que la línea con "% A" debería seguir la definición de macro A. El orden de las otras definiciones de macro no importa, siempre que estén definidas antes se les llama. Por lo general, en mis programas configuro una macro principal como la que describes, luego la última línea del programa llama a esta macro.

Otra opción a considerar es configurar una biblioteca de autocall de macro, que contiene las definiciones de muchas macros. Esto funciona mejor para macros reutilizables, para que no tenga que redefinirlos en cada programa.

3

una macro tiene que ser definido antes de que se llama. por razones de rendimiento, es mejor no definir una macro dentro de otra; si lo hace, se redefinirá cada vez que llame a la macro externa. las siguientes obras excelentes:

%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

Hay dos aspectos del código de macro en SAS para ser definidas: el código de macro que se compila y los parámetros de la macro:

código de macro:

El El código macro en sí es muy simple, ya que cuando se encuentra el token %macro, el sistema SAS comienza a compilar una macro SAS y continúa compilando hasta que llega a un token %mend. Los únicos problemas reales que puede enfrentar es si actualizó el código de macro y no lo vuelve a compilar antes de ejecutarlo; en estas situaciones, seguirá ejecutando la versión anterior que tiene en la biblioteca de macros. Por extensión, si intenta compilar una macro que llama a otra macro que aún no ha sido definida, entonces obtendrá un error. Por estas razones, necesitan ser programado en el orden en que se llaman (como se muestra en debajo de ejemplo:% level3 viene antes% level2, que viene antes% level1)

variables de macro: Al definir macro variables hay dos ámbitos: Global y Local. Una vez definidas, se puede acceder a las variables globales en cualquier lugar y en cualquier momento. Sin embargo, las variables locales solo existen localmente durante la ejecución de la macro en la que se ha definido.Por extensión, si la macro que se ha definido la variable local llama a cualquier otro macros, la macro variable local, seguirá siendo accesible:

Ejemplo de trabajo:

En el siguiente ejemplo, los macros son definido en orden inverso para evitar que SAS devuelva un invocación aparente de macro advertencia.

El siguiente diagrama ilustra la estructura de las siguientes macros en el siguiente ejemplo:

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

Compilar las macros anidadas:

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

Compilar el macro nivel superior (que a su vez llama a la anteriormente dos macros) y ejecútelo:

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

Puntos a tener en cuenta al revisar th correo de registro:

  • Fuera de% nivel3, & me devuelve una advertencia de que la variable macro no no existe
  • Dentro% nivel3, cuando & G1 se llama, se devuelve el valor almacenado en el ámbito local de% level3.Once fuera de% level3, el valor devuelve al valor almacenado globalmente
Cuestiones relacionadas