La confusion entre le nom de la variable (le contenant) et sa valeur (le contenu) est le piège numéro un du langage Macro. Rappelez-vous la règle d'or : à l'intérieur d'une macro, si vous voulez que SAS interprète le texte stocké et non le nom littéral, l'esperluette (&) est obligatoire lors de l'appel. En cas de doute, une simple instruction %PUT _ALL_; au début de votre code vous révélera exactement ce que le processeur macro "voit" avant l'exécution
Note : Le Besoin : Automatiser PROC FREQ avec des métadonnées
L'utilisateur souhaite créer une macro %f_freq pour générer des tables de fréquences. Ses contraintes sont précises :
La sortie doit être une table de données (OUT=).
La variable doit être formatée (regroupement des valeurs).
Un label spécifique (souvent long) doit être attribué à la variable dans la table de sortie, défini au préalable via un %LET.
Le code problématique :
%let Q1_label='Texte très long pour la question 1...';
%macro f_freq(var, var_w, var_label);
proc freq data=clean_data order=freq;
table &var / out=freqout.freq_&var;
format &var &var_w;
label &var=&var_label; /* Assigne le label */
run;
%mend;
/* L'appel qui ne fonctionne pas comme prévu */
%f_freq(Q1, Q1_w., Q1_label);
1
%let Q1_label='Texte très long pour la question 1...';
2
3
%macro f_freq(var, var_w, var_label);
4
PROC FREQDATA=clean_data order=freq;
5
TABLE &var / out=freqout.freq_&var;
6
FORMAT &var &var_w;
7
label &var=&var_label; /* Assigne le label */
8
RUN;
9
%mend;
10
11
/* L'appel qui ne fonctionne pas comme prévu */
12
%f_freq(Q1, Q1_w., Q1_label);
Note : L'Erreur : La résolution des variables macro (&)
Comme l'a souligné la réponse sur le forum, l'erreur ne se situe pas dans la définition de la macro, mais dans son appel.
L'utilisateur a écrit : %f_freq(Q1, Q1_w., Q1_label);
L'expert qui a répondu soulève un point technique intéressant : "Je pense que le format et le label sont utilisés pour l'affichage... Je ne pense pas qu'ils affectent l'agrégation."
Les Formats (FORMAT) : Ils affectent l'agrégation. Si vous appliquez un format qui regroupe les valeurs (par exemple, transformer 1, 2, 3 en "Petit"), PROC FREQ calculera la fréquence pour "Petit". C'est essentiel pour le recodage à la volée.
Les Labels (LABEL) : Ils n'affectent pas le calcul, mais ils sont cruciaux pour les métadonnées. L'instruction LABEL à l'intérieur de la procédure permet bien de stocker la description de la variable dans la table de sortie (OUT=).
Note : Les bonnes pratiques de débogage
Pour éviter ce genre de confusion entre le nom d'une variable et son contenu, voici deux conseils tirés de la discussion :
Utiliser %PUT : Avant de lancer une procédure complexe, affichez les valeurs dans la journal (Log) pour vérifier ce que la macro reçoit vraiment.
%macro f_freq(var, var_w, var_label);
%put NOTE: La variable est &var;
%put NOTE: Le label reçu est &var_label;
/* ... reste du code ... */
%mend;
1
%macro f_freq(var, var_w, var_label);
2
%put NOTE: La variable est &var;
3
%put NOTE: Le label reçu est &var_label;
4
/* ... reste du code ... */
5
%mend;
Attention aux Quotes : Si votre label contient déjà des guillemets (comme défini dans %let Q1_label='...'), assurez-vous de ne pas en rajouter dans l'instruction label &var=&var_label;.
L'écriture de macros nécessite une rigueur particulière sur la portée des variables. Rappelez-vous toujours : si vous voulez passer le contenu d'une variable définie par un %LET, vous devez impérativement utiliser le préfixe & lors de l'appel.
Wichtiger Haftungsausschluss
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.