SAS Macro alcance GLOBAL
Pregunta
¿hay una forma corta de hacer que TODAS las variables de macro creadas dentro de un macro global en su alcance?
es decir:
%macro x;
%global _all_; * ??? ;
%let x=1;
%let y=1;
%let z=1;
%mend;
Solución
La única forma en que se me ocurre hacer esto sin tener que declarar cada macro como global con anticipación y luego hacer una declaración% let es usar una macro en lugar de la declaración% let.
En el código a continuación, creo una macro llamada % mylet que tiene como único propósito la tarea de crear una variable global con el nombre y el valor que paso como argumentos. Luego uso esta macro en lugar de% let en todas partes donde quiero que se definan las variables globales.
ej.
%global myvar;
%let myvar=2;
se convertiría en ...
%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;
Otros consejos
Si crea la variable macro en código abierto, la variable macro se agregará automáticamente a la tabla de símbolos de macro global:
%let x=1;
%let y=1;
%let z=1;
Esto sería antes si creas la macro más grande:
%macro x;
<code here>
%mend x;
Otra alternativa sería crear las variables utilizando un paso de datos:
data _null_;
set LIB.DSET;
x = 1;
call symput('x',x);
run;
Si crea variables de macro dentro de un paso de datos, y ese paso de datos está dentro de una macro, las variables de macro creadas serán, por defecto, de alcance local para esa macro.
Utilizar
call symputx('macvar',macval,'g');
para crear variables macro globales.