Portata SAS Macro GLOBAL
Domanda
c'è un modo breve per rendere TUTTE le variabili macro create all'interno di una macro di portata globale?
vale a dire:
%macro x;
%global _all_; * ??? ;
%let x=1;
%let y=1;
%let z=1;
%mend;
Soluzione
L'unico modo in cui posso pensare di farlo senza dover dichiarare ogni macro come globale in anticipo e quindi fare un'istruzione% let è utilizzare una macro al posto di l'istruzione% let.
Nel codice seguente, creo una macro chiamata % mylet che ha come unico scopo il compito di creare una variabile globale con il nome e il valore che passo come argomenti. Quindi uso questa macro al posto di% let ovunque voglio che vengano definite le variabili globali.
ad es.
%global myvar;
%let myvar=2;
diventerebbe ...
% mylet (myvar, 2);
/* Define a macro to declare variables as global */
%macro mylet(var,value);
%global &var;
%let &var.= &value ;
%mend;
/* Test macro */
%macro test;
%mylet(myvar,2);
%mylet(myvar2,12);
%mylet(myvar3,'string');
/* see that they are global inside the macro */
title "Macro scope inside test macro";
proc sql;
select *
from dictionary.macros
where name in('MYVAR','MYVAR2','MYVAR3');
quit;
%mend;
%test;
/* Check to see if they are still global outside the macro */
title "Macro scope outside test macro";
proc sql;
select *
from dictionary.macros
where name in('MYVAR','MYVAR2','MYVAR3');
quit;
Altri suggerimenti
Se crei la variabile macro all'interno del codice aperto, la variabile macro verrà automaticamente aggiunta alla tabella dei simboli macro globali:
%let x=1;
%let y=1;
%let z=1;
Questo sarebbe prima di creare la macro più grande:
%macro x;
<code here>
%mend x;
Un'altra alternativa sarebbe quella di creare le variabili usando un passaggio di dati:
data _null_;
set LIB.DSET;
x = 1;
call symput('x',x);
run;
Se crei variabili macro in un passaggio di dati e tale passaggio di dati si trova all'interno di una macro, le variabili di macro create saranno, per impostazione predefinita, di portata locale per quella macro.
Usa
call symputx('macvar',macval,'g');
per creare variabili macro globali.