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

Les macros SAS éventuellement une valeur par défaut. Ces valeurs pourront être modifiées ultérieurement autant de fois que nécessaire ;

Plus en détail