2009-03-05 127 views
3

是否有一个简短的方法来创建宏范围内全局范围内创建的所有宏变量?SAS宏GLOBAL范围

即:

%macro x; 
%global _all_; * ??? ; 
%let x=1; 
%let y=1; 
%let z=1; 
%mend; 
+3

你真的想这样做吗?你可以用你的本地宏变量来破坏已经存在的全局宏变量。而且你正在寻求一种隐含的方式来做到这一点!建议的做法是在宏中声明%LOCAL(从不%GLOBAL)所有变量。 – 2009-03-12 14:54:20

+3

我完全同意张仲。如果您将此作为标准做法,您可以轻松地为自己或他人造成问题。如果你绝对必须这样做,那么尽量确保它们是用一个前缀命名的,这样它们不会被意外覆盖。 – 2012-04-11 17:18:11

回答

5

我能想到的要做到这一点,而无需声明每个宏作为全球领先的时间,那么唯一的办法做一个%let语句是使用宏代码代替%let语句。

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

例如。

%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; 
+0

而不是查询字典表,你可以简单地做: %put _global_;或%put _local_;查看全球和本地宏观变量(及其值)的列表。你也可以做%put _user_;仅查看用户定义的宏变量(和值)。 – 2009-03-12 15:01:48

4

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

%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; 
+1

使用`call symputx()`和``g``参数是更好的方法。 – 2012-04-11 17:15:07

3

如果创建一个数据步中宏变量,数据步是一个宏里面,默认情况下,创建的宏变量将在该宏的本地范围内。

使用

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

打造全球宏观变量。