programacion macro funciones español ejercicios ejemplos definicion comandos sas sas-macro

funciones - SAS: Llamar a una macro de otra... Orden de definiciones de macros



manual sas 9.4 español (4)

En mi código tengo varias macros. Macro A es la macro principal. La macro A luego llama a la macro B, que a su vez llama macro C.

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!


Debe definir una macro antes de invocarla, por lo que la línea con "% A" debería seguir la definición de macro A. El orden de las demás definiciones de macro no tiene importancia, siempre que se definan antes de invocarse. 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 macro autocall, que contiene las definiciones de muchas macros. Esto funciona mejor para macros reutilizables, para que no tenga que redefinirlos en cada programa.


Primero, debe definir una macro antes de llamarla.

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

Para profundizar en su problema: la biblioteca de llamadas automáticas es su amigo. Si su administrador de SAS no le permite colocar sus macros en la biblioteca de llamada automática, puede agregar la llamada automática de la siguiente manera:

filename mymacros ''c:/mysas''; /*this defines the directory you have stored your macros*/ options sasautos=(sasautos mymacros) mautosource;


una macro tiene que ser definida antes de ser llamada. 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. lo siguiente funciona bien:

%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 */


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

Código de macro:

El código de macro en sí mismo es muy simple porque cuando se encuentra el token de %macro el sistema SAS comienza a compilar una macro de SAS y continúa compilando hasta que alcanza un token de %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 estos motivos, deben programarse en el orden en que se llaman (como se muestra en el ejemplo siguiente:% level3 viene antes de% level2, que viene antes de% level1)

Variables de macro: al definir variables de macro , 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 donde se ha definido la variable local llama a cualquier otra macro, la variable macro local seguirá estando accesible:

Ejemplo de trabajo:

En el siguiente ejemplo, las macros se definen en orden inverso para evitar que SAS devuelva una invocación aparente de advertencia de macro .

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

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

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

Compile la macro de nivel superior (que a su vez llama a las dos macros anteriores) y ejecútela:

%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 el registro:

  • Fuera de% level3, & I devuelve una advertencia de que la variable macro no existe
  • Dentro de% level3, cuando se llama a & G1, devuelve el valor almacenado en el ámbito local de% level3.Una vez fuera de% level3, el valor vuelve al valor almacenado globalmente