2009-02-11 9 views
6

Dans mon code, j'ai plusieurs macros. La macro A est la macro principale. La macro A appelle alors la macro B qui à son tour appelle la macro C.SAS: Appel d'une macro à partir d'une autre ... Ordre des définitions de macro

Dans SAS, dois-je les définir à l'envers? En d'autres termes, dois-je d'abord définir la macro C, puis la macro B, puis la macro A? Ou est-ce important parce que SAS lit tout le code avant qu'il ne frappe réellement la commande pour exécuter les macros? D'ailleurs, puis-je exécuter la commande pour exécuter la macro en tant que première instruction dans mon code, puis définir les macros sous la commande?

Merci!

Répondre

3

D'abord, vous devez définir une macro avant qu'elle ne soit appelée. Deuxièmement, peu importe où la macro est invoquée tant que vous l'avez chargée auparavant. Pour plus d'informations sur votre problème: La bibliothèque autocall est votre ami. Si vous administrateur SAS ne vous permettra de mettre vos macros dans la bibliothèque de autocall, vous pouvez ajouter l'autocall comme ceci:

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

options sasautos=(sasautos mymacros) mautosource; 
+0

Techniquement parlant, la bibliothèque autocall ne charge pas les macros 'en amont'. Si l'utilisateur essaie d'exécuter une macro et que cette macro n'a pas déjà été définie, SAS commencera à la rechercher dans la bibliothèque autocall. S'il trouve avec succès un nom de fichier correspondant à l'appel, et que ce fichier contient un nom de macro correspondant à l'appel, alors il compilera la macro. Si vous apportez ensuite des modifications à ce fichier dans la bibliothèque autocall, vous devrez renvoyer le code manuellement pour que ces modifications soient disponibles dans une session SAS interactive. –

1

Vous devez définir une macro avant qu'elle ne soit appelée, donc la ligne avec "% A" doit suivre la définition de la macro A. L'ordre des autres définitions de macros n'a pas d'importance, tant qu'elles sont définies avant elles sont appelées. Typiquement dans mes programmes j'ai mis en place une macro principale comme tu décris, alors la dernière ligne du programme appelle cette macro.

Une autre option à envisager est de configurer une bibliothèque de macro autocall, qui contient les définitions de nombreuses macros. Cela fonctionne mieux pour les macros réutilisables, de sorte que vous n'avez pas à les redéfinir dans chaque programme.

3

une macro doit être défini avant l'appel. Pour des raisons de performances, il est préférable de ne pas définir de macro à l'intérieur d'une autre. Si vous le faites, elle sera redéfinie à chaque appel de la macro externe. les travaux suivants fins:

%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

Il y a deux aspects de code macro SAS à définir: le code macro qui est compilée et les paramètres macro:

Code Macro:

Le Le code de macro lui-même est très simple car lorsque le jeton %macro est rencontré, le système SAS commence à compiler une macro SAS et continue de compiler jusqu'à ce qu'il atteigne un jeton %mend. Les seuls vrais problèmes que vous pouvez rencontrer sont les suivants: si vous avez mis à jour le code de macro et ne le recompilez pas avant de l'exécuter, dans ces situations, il exécutera toujours l'ancienne version dans la bibliothèque de macros. Par extension, si vous essayez de compiler une macro qui appelle une autre macro qui n'a pas encore été définie, vous obtiendrez une erreur. Pour ces raisons, ils doivent être programmés dans l'ordre dans lequel ils sont appelés (comme indiqué dans l'exemple ci-dessous:% level3 est avant% niveau 2, ce qui est avant% niveau1)

les variables macro: Lors de la définition macro variables Il existe deux étendues: globale et locale. Une fois définies, les variables globales peuvent être accédées n'importe où et à n'importe quel moment. Cependant, les variables locales n'existent que localement lors de l'exécution de la macro dans laquelle elle a été définie.Par extension, si la macro où la variable locale a été définie appelle toutes les autres macros, la variable macro locale sera toujours accessible:

Exemple de travail:

Dans l'exemple suivant, les macros sont défini dans l'ordre inverse pour empêcher le retour de SAS un Invocation apparente de l'avertissement de macro.

Le schéma ci-dessous illustre la structure des macros suivantes dans l'exemple suivant:

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

compiler les macros imbriquées:

%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 haut niveau (qui appelle à son tour ci-dessus deux macros) et l'exécuter:

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

Points à noter lors de l'examen e e journal:

  • En dehors de% Level3, & je retourne un avertissement que la variable macro ne existe pas
  • Dans% Level3, lorsque & G1 est appelée, elle retourne la valeur stockée dans la portée locale de% level3.Une fois en dehors de% level3, la valeur renvoie à la valeur stockée globalement