Macro sous SAS

Economisez votre code SAS grâce au langage macro

Le langage par instructions n'est pas le seul moyen de programmer sous SAS. Il existe en effet un second langage reconnu par un compilateur macro cohabitant. Ce langage, dit "macro", permet, comme son nom l'indique d'automatiser, ou du moins d'industrialiser les procédures SAS. Nous allons voir, avec un exemple simple, les bases des macros SAS.

Base de travail

Posons tout d'abord la base à partir de laquelle nous allons implémenter notre macro. Nous allons travailler sur la base native sashelp.cars et allons nous contenter dans un premier temps de réaliser une PROC FREQ pour analyser la distribution de la variable associée au constructeur (Make).
Voici notre code :


title "Distribution de la variable MAKE";
proc freq data=sashelp.cars order=freq;
tables make / plots=freqplot;
run;
SAS macro

Comme vous le voyez, nous nous contentons d'une simple analyse de la variable MAKE, qui correspond au constructeur du véhicule. Nous avons ajouté un titre reprenant le nom de la variable, ainsi que l'histogramme dressant la distribution.

Introduction d'une variable macro

Supposons maintenant que nous devions mener cette analyse sur d'autres variables de notre dataset. Si nous ne voulons pas être amené à reproduire le même code pour chaque colonne analysée, il nous faudra alors introduire une variable macro. Ces variables vont être instanciées via l'instruction %let et stockées dans une table de symbols macro. La valeur d'une variable macro sera ensuite récupérée via son nom, précédé d'un caractère &. Les caractères % et & sont sous SAS des déclencheurs macro qui vont permettre à SAS de switcher entre ses compilateurs.
Voici la PROC FREQ précédente avec une variable :


%let var=MAKE;
title "Distribution de la variable &var";
proc freq data=sashelp.cars order=freq;
tables &var / plots=freqplot;
run;

Le code ci-dessus donne exactement le même résultat que le précèdent.
Nous ne pouvons bien sur nous contenter de créer une variable, il nous faut mutualiser le code et créer une fonction macro.


%macro analyse(var);
title "Distribution de la variable &var";
proc freq data=sashelp.cars order=freq;
tables &var / plots=freqplot;
run;
%mend analyse;

%analyse(MAKE)

Nous avons ci-dessus créé une fonction macro nommée "analyse". Comme vous le voyez, la signature d'une fonction macro commence par le mot clé %macro suivi du nom de la fonction puis des paramètres. Les paramètres, s'il y en a plus d'un, sont séparés par une virgule. La fin de fonction est marquée par le mot clé %mend suivi du nom de la fonction qu'il termine.
Les chaines de caractère à éditer qui contiennent une variable macro (comme c'est le cas pour notre titre) doivent être encadrées par des guillemets doubles ("..."). Dans le cas contraire la variable de sera pas interprétée comme telle.
Nous avons à la suite fait appel à notre fonction en ajoutant le caractère % au nom de la fonction. Cet appel peut être renouvelé bien sûr pour chaque colonne à analyser.

Bibliothèques et espaces de noms

Nous pourrions vouloir passer la bibliothèque et la table de travail en paramètres. Comme nous le savons la relation d'appartenance entre les deux est marquée par un point. Il conviendra de doubler ce point si nous voulons que SAS puisse interpréter le résultat :


%macro analyse(base, table, var);
title "Distribution de la variable &var";
proc freq data=&base..&table order=freq;
tables &var / plots=freqplot;
run;
%mend analyse;

%analyse(sashelp, cars, MAKE)

Journalisation détaillée

Il est possible de visualiser plus en détail comment SAS interprète les variables macro. Pour ce faire il suffira de stipuler les options symbolgen et mprint avant la déclaration de la fonction macro :


options symbolgen mprint;

%macro analyse(base, table, var);
title "Distribution de la variable &var";
proc freq data=&base..&table order=freq;
tables &var / plots=freqplot;
run;
%mend analyse;

%analyse(sashelp, cars, MAKE)

Voici le compte-rendu SAS dans le journal :

SAS macro

Retrouvez dans la rubrique "Nos datasets" toutes les données dont vous aurez besoin pour tester et pratiquer !