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.
Aviso importante
Los códigos y ejemplos proporcionados en WeAreCAS.eu son con fines educativos. Es imperativo no copiarlos y pegarlos ciegamente en sus entornos de producción. El mejor enfoque es comprender la lógica antes de aplicarla. Recomendamos encarecidamente probar estos scripts en un entorno de prueba (Sandbox/Dev). WeAreCAS no acepta ninguna responsabilidad por cualquier impacto o pérdida de datos en sus sistemas.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.