是否有一种简短的方法可以在范围内的宏全局内创建所有宏变量?

即:

%macro x;  
 %global _all_;  * ??? ;  
 %let x=1;  
 %let y=1;  
 %let z=1;  
%mend;
有帮助吗?

解决方案

我可以想到这样做的唯一方法,而不必提前将每个宏声明为全局,然后执行%let语句就是使用宏 代替 %let statement。

在下面的代码中,我创建了一个名为%mylet 的宏,其唯一目的是创建一个全局变量,其名称和值作为参数传递。然后我使用这个宏代替%let,我想要定义全局变量。

例如。

%global myvar;
%let myvar=2;

会变成......

  

<代码>%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;

其他提示

如果在开放代码中创建宏变量,宏变量将自动添加到全局宏符号表中:

%let x=1;  
%let y=1;  
%let z=1; 

在创建较大的宏之前

%macro x;
  <code here>
%mend x;

另一种方法是使用数据步骤创建变量:

data _null_;
    set LIB.DSET;
    x = 1;
    call symput('x',x);
run;

如果在数据步骤中创建宏变量,并且该数据步骤在宏内,则默认情况下,创建的宏变量将在该宏的范围内本地化。

使用

call symputx('macvar',macval,'g'); 

创建全局宏变量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top