2009-03-05 179 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'); 

打造全球宏觀變量。