Blogs

Fonction de macro SAS

Le langage de macro SAS® permet énormément aux programmeurs SAS de bénéficier de la polyvalence et de l’efficacité de leur développement de code. Il permet aux utilisateurs de SAS de modulariser le code de programmation avec des composants « une fois écrits – plusieurs fois utilisés » et, dans de nombreux cas, de générer automatiquement du code SAS piloté par les données.

Article de blog connexe: Fonction macro polyvalente pour obtenir des informations sur les ensembles de données

Langage de macro et processeur de macro

En règle générale, le logiciel SAS traite votre programme SAS étape par étape, en le recherchant d’abord des objets de langage de macro – variables de macro référencées comme &somename, et des macros référencées comme %somename. S’il est trouvé, le logiciel SAS active le processeur de macro qui résout et remplace ces références de macro selon la syntaxe du langage de macro avant que SAS ne compile et n’exécute vos étapes de programmation.

Langage de macro SAS vs. Langage de programmation SAS

Un programme SAS se compose généralement de deux couches souvent entrelacées – couche macro et couche non macro, chacune avec sa propre syntaxe et son propre moment de compilation et d’exécution. En d’autres termes, le code SAS est une combinaison de deux langages distincts :

  • Langage de programmation SAS (composé d’étapes de DONNÉES, d’étapes de PROC et d’instructions globales telles que LIBNAME, OPTIONS, TITLE, etc.)
  • Langage de macro SAS (composé de %LET, %IF, %DO, fonctions de macro, etc.) qui est traité séparément et avant que le compilateur SAS n’exécute le code du langage de programmation SAS.

La différence entre eux est comme une différence entre cuisiner un repas et manger le repas. Dans cette analogie repas = code, cuisine = langage de macro SAS, manger = langage de programmation SAS. Une compréhension claire de cette différence est la clé pour devenir un programmeur SAS à succès.

Deux types de macros SAS

Il existe deux types distincts de macros SAS : les macros

  1. qui génèrent du code de langage de programmation SAS pouvant s’étendre sur plusieurs instructions ou étapes SAS;
  2. Macros qui génèrent des valeurs de chaîne qui peuvent être utilisées dans le cadre du code du langage de programmation SAS ou des valeurs de données, mais ce ne sont pas des instructions ou des étapes SAS complètes. Ce type ne génère aucun code exécutable SAS, juste une valeur.

Qu’est-ce qu’une fonction de macro SAS ?

La fonction de macro SAS est une macro SAS qui génère une valeur. En d’autres termes, il s’agit de la macro de type 2 décrite ci-dessus. Comme toutes les macros SAS, les fonctions de macro SAS peuvent avoir n’importe quel nombre (zéro ou plus) de paramètres positionnels ou / et nommés (arguments). Les utilisateurs SAS peuvent définir leurs propres fonctions de macro, mais ce faisant, vous ne pouvez utiliser aucune syntaxe de langage SAS ; seule la syntaxe de langage de macro SAS est autorisée. Vous pouvez utiliser des fonctions de macro existantes dans votre propre définition de fonction de macro. Entre autres, l’une des plus puissantes est la fonction de macro %SYSFUNC qui apporte une multitude de fonctions de langage SAS dans le langage de macro SAS.

Sources des fonctions de macro SAS

Les fonctions de macro SAS peuvent provenir des trois sources suivantes.

Fonctions de macro prédéfinies

Fonctions de macro prédéfinies qui font partie du processeur de macro. Ce sont des fonctions macro telles que %eval, %length, %quote, %scan, %str, %sysfunc, %upcase, etc. Voici une liste complète des fonctions de macro SAS pré-construites.

Fonctions de macro d’appel automatique

Macros d’appel automatique, certaines d’entre elles sont de type 1 (macros) et d’autres de type 2 (fonctions de macro) telles que %cmpres, %left, %lowcase, %trim, %verify, etc. Ces fonctions macro complètent les fonctions macro prédéfinies. La principale différence avec les fonctions de macro prédéfinies est que les fonctions de macro à appel automatique sont des échantillons de programmes des fonctions de macro définies par l’utilisateur qui sont écrites en langage de macro SAS et mises à votre disposition sans avoir à les définir ou à les inclure dans vos programmes. Les fonctions de macro d’appel automatique sont fournies avec l’installation de votre logiciel SAS et sont généralement préconfigurées pour vous en définissant les options système MAUTOSOURCE et SASAUTOS=macro. Ils peuvent inclure plusieurs bibliothèques de macro en fonction des produits SAS sous licence sur votre site. Par exemple, pour mon installation de BASE SAS, la bibliothèque de macro d’appel automatique se trouve dans le dossier suivant :

C:\Program Files\SASHome\SASFoundation\9.4\core\sasmacro

Voici une liste sélectionnée de macros d’appel automatique fournies avec le logiciel SAS.

Du point de vue de l’utilisation, vous ne remarquerez aucune différence entre les fonctions de macro pré-construites et d’appel automatique. Par exemple, la fonction macro %upcase() est pré-construite, tandis que la fonction macro %lowcase() est une fonction macro d’appel automatique. Ils appartiennent à des familles entièrement différentes, mais nous les utilisons comme s’ils étaient des frères et sœurs complémentaires.

Fonctions de macro définies par l’utilisateur

Enfin, il existe des fonctions de macro définies par l’utilisateur qui ne sont pas fournies avec l’installation SAS. Ce sont les fonctions de macro que vous définissez vous-même. Habituellement, ils sont conservés séparément des macros d’appel automatique principalement afin de les distinguer de celles fournies par SAS.

Pour activer l’accès à votre propre bibliothèque de macro SAS en plus de la bibliothèque de macro d’appel automatique (ou des bibliothèques), vous pouvez utiliser l’option INSERT=system:
options insert=(sasautos= »path_to_your_own_macro_library_folder »);

Au lieu de remplacer la valeur SASAUTOS, cette option insère une valeur supplémentaire dans l’option SASAUTOS existante en tant que première valeur, vous permettant ainsi de puiser d’abord dans votre propre bibliothèque de macro, puis également dans des bibliothèques d’appels automatiques SAS prédéfinies.

Création d’une fonction de macro définie par l’utilisateur

Considérons l’exemple suivant. Supposons que nous souhaitions créer une fonction macro qui prend un nom d’ensemble de données comme argument et renvoie une valeur égale au nombre d’observations dans cet ensemble de données.

Nous savons que le code suivant calcule le nombre d’observations dans un ensemble de données :

data _null_; call symputx('NOBS',n); stop; set SASHELP.CARS nobs= n; run;%put &=NOBS; NOBS= 428

Peut-on créer une fonction de macro SAS en enfermant ce code dans une macro? Quelque chose comme ceci:

%macro nobs(dset=, result=); %global & résultat; données _null_; appelez symputx("& résultat", n); stop; définir & résultat", n);&

dset nobs=n; exécuter;%mend nobs;

La réponse est « Non ». Oui, nous avons créé une macro valide ; nous pouvons invoquer cette macro pour produire le résultat :

%nobs(dset=SASHELP.CARS, result=NOBS); %put &=NOBS; NOBS=428

Mais ce n’est pas une fonction macro. Rappelez-vous une macro de type 2 qui ne génère aucun code de langage de programmation SAS, juste une valeur? Mais cette macro génère du code SAS qui attribue une valeur à la variable macro spécifiée comme deuxième argument (result= NOBS).

Afin de créer une fonction de macro valide, notre macro ne doit contenir aucun code de langage SAS – ni une étape de DONNÉES, ni une étape de PROC. Il ne peut être composé que du code de langage de macro SAS. Le voici:

%macro nobs(dset); %dsid local n; % let dsid=%sysfunc(open(&dset)); % if & dsid% alors % do; Je ne sais pas si j'ai un problème avec le système de données, mais je ne sais pas si c'est le cas, mais je ne sais pas si c'est le cas, mais je ne sais pas si c'est le cas, mais je ne sais pas si c'est le cas.; &n%mend nobs; 

Lorsque le processeur de macro exécute cette macro, le seul objet transmis au compilateur de langage SAS est la valeur indiquée dans la ligne juste avant le %mend. C’est la valeur calculée du nombre d’observations (notée &n). C’est la seule chose visible par le compilateur de langage SAS, le reste est le code de langage de macro visible et géré par le processeur de macro SAS.

IMPORTANT: Lors de la définition de la fonction de macro SAS, utilisez toujours l’instruction %local pour répertorier TOUTES les variables de macro créées dans votre macro afin de vous assurer qu’elles n’écraseront pas accidentellement les variables de macro du même nom dans l’environnement appelant. Vous n’avez pas besoin de déclarer %local pour les paramètres de macro car ils sont toujours locaux automatiquement.

Exemples d’utilisation des fonctions de macro SAS

Lorsqu’une fonction de macro est définie de cette façon, où que vous placez son appel %nobs(SASHELP.VOITURES) dans votre code SAS, il sera évalué et remplacé par la valeur correspondante (dans ce cas, il s’agit du numéro 428) par le processeur de macro SAS. De cette façon, vous pouvez éviter le codage en dur de qualité inférieure et rendre votre code SAS dynamique et puissant. Vous pouvez utiliser des fonctions de macro dans de nombreux contextes de codage SAS. Par exemple :

  • Instructions d’affectation pour la variable de macro : %let NOBS =%nobs(SASHELP.CARS);
  • Instruction d’affectation dans une étape de DONNÉES : x =%nobs(SASHELP.CARS);
  • Dans le cadre d’une expression dans une étape de DONNÉES : x=%nobs(SASHELP.CARS) / 2 + 3;
  • Comme valeur d’une boucle de pas de DONNÉES do: est-ce que je = 1 à % nobs (SASHELP.CARS);
  • Comme valeur d’une boucle de macro do: %do & i= 1% à%nobs(SASHELP.VOITURES);
  • Dans le cadre de la condition dans l’instruction IF: if%nobs(SASHELP.VOITURES) > 500 alors faites;

Et ainsi de suite. Il est important de noter que les arguments (paramètres) des fonctions de macro doivent être des constantes SAS ou des expressions de macro résolvant des constantes SAS. Étant donné que les fonctions de macro sont résolues par le processeur de macro avant l’exécution du programme SAS, les arguments ne peuvent pas être des noms de variables. C’est la principale différence entre les fonctions MACRO et les fonctions SAS.

Vos pensées ?

Trouvez-vous cet article utile? Utilisez-vous des fonctions de macro SAS ? Pouvez-vous suggérer d’autres exemples d’utilisation? Veuillez partager avec nous dans les commentaires ci-dessous.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.