Pregunta

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

En SAS, tengo que definirlos en orden al revés? En otras palabras, tengo que definir un macro C, luego macro B, entonces A última macro? ¿O se importa ya que SAS lee todo el código antes de que realmente golpea el comando para ejecutar las macros? Por lo demás, 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!

¿Fue útil?

Solución

En primer lugar, debe definir una macro antes de que se llama.

En segundo lugar, no importa donde la macro se invoca siempre y cuando se haya cargado antes a mano.

Para más detalles sobre el problema: La biblioteca autocall es su amigo. Si el administrador SAS no le permitirá poner sus macros en la biblioteca autocall, puede anexar la autocall este modo:

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

options sasautos=(sasautos mymacros) mautosource; 

Otros consejos

una macro tiene que ser definido antes de que se llama. por razones de rendimiento, lo mejor es no definir una macro dentro de otra - si lo hace, entonces se volverá a definir cada vez que se llama 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
*/

Debe definir una macro antes de que se llama, por lo que la línea con "% A" tendría que seguir la definición de macro A. El orden de las otras definiciones de macros no importa, siempre y cuando se definen antes de que se son llamados. Normalmente en mis programas de I fijó una macro principal como usted describe, a continuación, la última línea del programa llama a esta macro.

Otra opción a considerar es la creación de una biblioteca autocall macro, que contiene las definiciones de muchos macros. Esto funciona mejor para las macros reutilizables, de modo que usted no tiene que volver a definirlos en cada programa.

Hay dos aspectos de código de macro en SAS que ser definidas: 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í es muy simple, ya que cuando se encuentra el token %macro el sistema SAS comienza a compilar una macro SAS y mantiene la compilación hasta que llega a una ficha %mend. Los únicos problemas reales que puede venir en contra es si ha actualizado el código de macro y no se vuelve a compilar antes de ejecutarlo - en estas situaciones todavía se ejecutará la versión antigua 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 definido por lo que recibirá 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)

Las variables de macro: Al definir la macro Variables hay dos ámbitos: global y local. Una vez definidas, las variables globales se puede acceder en cualquier lugar y en cualquier momento. Sin embargo, las variables locales sólo existen a nivel local durante la ejecución de la macro en el 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 define en orden inverso Para evitar SAS devolver un invocación aparente advertencia macro.

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 los dos macros anteriores) y ejecutarlo:

%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 del nivel 3%, y que devuelve una advertencia de que la variable macro hace no existe
  • Dentro% nivel3, cuando G1 y se llama, devuelve el valor almacenado en el ámbito local de% level3.Once fuera de% level3, el valor vuelve al valor almacenado globalmente
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top