Cours 7 - Language Macro
Transcription
Cours 7 - Language Macro
STT1682 – Progiciels en Statistique et Actuariat Cours 7 – Language Macro SAS Intro Il existe un language en SAS appelé le language macro ayant comme objectif de rendre les programmes SAS plus flexible et efficaces. Contrairement aux déclarations précédentes vus durant le cour, les déclarations macros n'affectent pas les bases de données, mais plutôt le code SAS en tant que tel. Toutes déclarations macros sont exécutés strictement lors de l'étape de compilation du code. Macro Variables/Paramètres Les macros variables courament appelés des paramètres sont des variables stocké en mémoire de SAS et non à l'intérieur d'une base de donnée. Lors de la compilation du code, toutes appelations d'une macro variable sera remplacé par sa valeur choisit. De cette façon, nous avons simplement qu'à changer la valeure de la macro variable à un seul endroit dans le code et le changement sera réfléter à travers tout le code lors de la compilation rendant ainsi le programme significativement plus flexible. Par exemple, si notre code SAS a besoin d'utiliser la variable PRIME2013 dans la base BASE2013, mais qu'éventuellement on aimerait utiliser la variable PRIME2014 dans la base BASE2014. Au lieu de manuellement changer tous les endroits à travers notre code où l'année 2013 est utilisé que ça soit à travers le nom de variables, de bases, de conditions SAS... On pourrait tout simplement créer la macro variable "ANNEE" qui pourrait prendre la valeur de l'année désirée lors de l'exécution du code. Déclaration Macro : %LET La 1ère déclaration qu'on va voir servira à définir une macro variable qui pourra être utilisé à travers le programme SAS Syntaxe : %LET MACROVAR1=VALEUR1; Appelation de macros variables : &MACROVAR1. Lors de la compilation du code, à chaque fois que SAS va rencontrer &MACROVAR1., il va le remplacer par la valeur décider soit VALEUR1 dans l'exemple ci-dessus. Note - Le % va précéder toutes déclarations macros - Le code macro peut être mis à n'importe qu'elle endroit dans notre code, mais il ne faut pas oublier qu'il sera exécuté lors de la compilation et qu'on ne peut donc pas utiliser les valeurs que peuvent prendre les observations d'une base de donnée. David Langlois – notes STT1682 1 Exemple %LET VILLE=Montreal; DATA BASE_&VILLE.(WHERE=(VILLE="&VILLE.")); VILLE="Montreal";Output; VILLE="Quebec";Output; VILLE="Laval";Output; RUN; *Remarquer la différence entre la macro variable VILLE et la variable VILLE; Déclaration Macro : %MACRO Lors de la dernière déclaration, nous avons vu comme définir une macro variable pouvant être appelé à travers le programme pour prendre une valeur prédéfinit. Ici, on va voir comment définir un segment de code en entier comme étant représenté par une macro SAS. À l'intérieur de cette macro SAS, on pourrait aussi appelés divers macros variables qui n'existeraientt qu'à l'intérieur du code de la macro. Les Macros SAS sont fréquemment utilisés lorsque on a des segments répétifs à travers notre programme SAS. Au lieu de les coder plusieurs fois, on crée une seule macro SAS qu'on va ensuite appeler plusieurs fois. Les légères différences entre les appelations peuvent être réglés par des macros variables variant d'une appelation à l'autre. Syntaxe : %MACRO NOMMACRO(MACROVAR1,MACROVAR2...);*Macros variables optionelles; ... Code SAS... %MEND; Appelation de la Macro : %NOMMACRO; Exemple %MACRO CREER_VILLE(VILLE,ANNEE); DATA &VILLE.&ANNEE.; VILLE="&VILLE."; ANNEE=&ANNEE.; RUN; %MEND; %CREER_VILLE(Montreal,2010); v%CREER_VILLE(Laval,2011); David Langlois – notes STT1682 2 Déclaration Macro : %IF/%THEN/%THEN %DO/%ELSE... Précedemment, nous avons vu comment utiliser un language conditionelle à l'intérieur d'une étape DATA afin d'effectuer un traitement (ou non) sur des variables de la base de donnée à l'aide des IF/THEN/THEN DO/ELSE... Maintenant nous allons voir comment utiliser un language similaire, mais affectant le code SAS en tant que tel. Par exemple, nous pourrons rendre l'exécution d'une section entière de notre programme SAS conditionelle à ce qu'une condition soit respecté. Encore une fois, il sera important de comprendre que comme le code macro est exécuter à l'étape de compilation, on ne peut PAS utiliser aucune valeurs de variables qui sont à l'intérieur d'une base de donnée. Les conditions macros seront donc plutôt sur des valeurs prisent par des macros variables Syntaxe #1: %IF CONDITION1 %THEN ... ; %ELSE %IF CONDITION2 %THEN ... ;*On pourrait ajouter d'autres %ELSE %IF; %ELSE ... ; Syntaxe #2: %IF CONDITION1 %THEN %DO ; ...Code SAS... %END; %ELSE %IF CONDITION2 %THEN %DO; ...Code SAS... %END; %ELSE DO; ...Code SAS... %END; David Langlois – notes STT1682 3 Exemple %LET ANNEE=2010; %IF &ANNEE.=2010 %THEN %DO; DATA BASESAS; ANNEE="2010"; RUN; %END; %ELSE %IF &ANNEE.=2011 %THEN %DO; DATA BASESAS; ANNEE="2011"; RUN; %END; %ELSE %DO; DATA BASESAS; ANNEE="Erreur"; RUN; %END; Déclaration Macro : Boucle %DO Il sera aussi possible d'utiliser des boucles %DO pour exécuter un segment de code à répétition. On remarquera les différences suivantes avec la boucle DO vu précedemment : - %DO sera executé qu'une seule fois lors de la compilation du code et non une fois par observation de la base donnée - %DO va créer une macro variable (i.e. &I.) et non une variable dans la base de donnée Syntaxe : %DO K=X %TO Y %BY Z; ...Code SAS... %END; Dans le code ci-dessus, la macro variable K sera crée (appelé à l'aide de &K.) et prendra les valeurs de X à Y par incrément de Z. Le code SAS sera executé en boucle jusqu'à temps que K ne soit plus borné entre X et Y. David Langlois – notes STT1682 4 Déclaration Macro : %INCLUDE À l'aide de %INCLUDE, on peut appeler et exécuter un programme SAS en entier à l'intérieur de notre code Syntaxe : %INCLUDE "REPERTOIRE/PROGRAMME.SAS"; Dans le code ci-dessus, le programme PROGRAMME.SAS sera exécuter au complet à l'endroit ou le %INCLUDE est mis dans le code. Il faudra donc faire attention que l'inclusion de ce programme ne cause pas de conflit ou de faute de syntaxe avec notre programme principal. Déclaration CALL SYMPUT Jusqu'à présent, nous avons vu comment définir des macros variables à l'aide d'un %LET ou à l'intérieur même d'une macro SAS. Il existe une troisième façon nous permettant de définir une macro variable prenant la valeur d'une variable à l'intérieur d'une base de donnée. Syntaxes: CALL SYMPUT("MACROVAR1",VAR1); Les CALL SYMPUT ci-dessus vont créer la macro variable MACROVAR1 étant égale à la valeur prise par VAR1. Ne pas oublier que cette déclaration n'est pas une déclaration macro et sera donc exécuté à l'intérieur d'une étape DATA pour chacune des observations. À moins d'utiliser des conditions spécifiques, la valeur retenu pour MACROVAR1 sera donc celle de la dernière observation. Note - La macro variable créant pourra être utilisé seulement APRÈS que l'étape DATA contenant le CALL SYMPUT soit terminé. Exemple DATA BASE1; X=1;OUTPUT; X=2;OUTPUT; X=3;OUTPUT; RUN; DATA _NULL_;*_NULL_ signifie qu'on ne veut créer aucune base de donnee; SET BASE1; CALL SYMPUT("NBOBS",X); *La macro variable NBOBS sera donc cree et sera egale au nb d observation dans BASE1; RUN; David Langlois – notes STT1682 5
Documents pareils
Les macros SAS
éventuellement une valeur par défaut. Ces valeurs pourront être modifiées
ultérieurement autant de fois que nécessaire ;