SAS: вызов одного макроса из другого ... Порядок определений макросов - PullRequest
6 голосов
/ 11 февраля 2009

В моем коде у меня есть несколько макросов. Макрос А является основным макросом. Затем макрос A вызывает макрос B, который, в свою очередь, вызывает макрос C.

В SAS я должен определять их в обратном порядке? Другими словами, должен ли я сначала определить макрос C, затем макрос B, а затем макрос A? Или это имеет значение, так как SAS считывает весь код до того, как он действительно нажимает команду для запуска макросов? В связи с этим, можно ли выполнить команду для запуска макроса в качестве первого оператора в моем коде, а затем определить макросы под командой?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 11 февраля 2009

Сначала вы должны определить макрос, прежде чем он будет вызван.

Во-вторых, не имеет значения, где макрос вызывается, если вы загрузили его заранее.

Для уточнения вашей проблемы: Библиотека автозвонков - ваш друг. Если ваш администратор SAS не разрешит вам помещать ваши макросы в библиотеку автоматического вызова, вы можете добавить автоматический вызов следующим образом:

filename mymacros 'c:\mysas'; 
/*this defines the directory you have stored your macros*/

options sasautos=(sasautos mymacros) mautosource; 
3 голосов
/ 22 февраля 2009

макрос должен быть определен до его вызова. по соображениям производительности лучше не определять макрос внутри другого - если вы это сделаете, он будет переопределяться при каждом вызове внешнего макроса. отлично работает следующее:

%macro a;
  %put a;
  %b
%mend a;

%macro b;
  %put b;
  %c
%mend b;

%macro c;
  %put c;
%mend c;

%*-- %a is main --*;
%a
/* on log
a
b
c
*/
1 голос
/ 11 февраля 2009

Вы должны определить макрос перед его вызовом, поэтому строка с «% A» должна следовать определению макроса A. Порядок других определений макросов не имеет значения, если они определены до того, как они называются. Обычно в моих программах я настраиваю основной макрос, как вы описали, затем последняя строка программы вызывает этот макрос.

Другим вариантом, который необходимо рассмотреть, является настройка библиотеки автоматического вызова макросов, которая содержит определения многих макросов. Это лучше всего подходит для макросов многократного использования, поэтому вам не нужно переопределять их в каждой программе.

0 голосов
/ 26 мая 2015

В SAS необходимо определить два аспекта макрокода: код макроса, который компилируется, и параметры макроса:

Макрокод:

Сам код макроса очень прост в том, что при обнаружении токена %macro система SAS начинает компилировать макрос SAS и продолжает компилировать, пока не достигнет токена %mend. Единственные реальные проблемы, с которыми вы можете столкнуться, это если вы обновили код макроса и не перекомпилировали его перед выполнением - в этих ситуациях он все равно будет запускать старую версию, которая есть в библиотеке макросов. Если вы попытаетесь скомпилировать макрос, который вызывает другой макрос, который еще не был определен, вы получите ошибку. По этим причинам их необходимо запрограммировать в том порядке, в котором они вызываются (как показано в следующем примере:% level3 предшествует% level2, что предшествует% level1)

Макропеременные: При определении макроса переменных существует две области действия: глобальная и локальная. После определения глобальные переменные могут быть доступны в любом месте и в любое время. Однако локальные переменные существуют только локально во время выполнения макроса, в котором он был определен. Таким образом, если макрос, в котором определена локальная переменная, вызывает любые другие макросы, локальная переменная макроса будет по-прежнему доступна:

Рабочий пример:

В следующем примере макросы определены в обратном порядке , чтобы SAS не возвращал Кажущийся вызов макроса предупреждение.

На следующем рисунке показана структура следующих макросов в следующем примере:

|-----------------------------|
|GLOBAL                       |
|  |------------------------| |
|  |LEVEL1                  | |
|  |  |-------------------| | |
|  |  |LEVEL2             | | |
|  |  |  |--------------| | | |
|  |  |  |  LEVEL3      | | | |
|  |  |  |--------------| | | |
|  |  |-------------------| | |
|  |------------------------| |
|-----------------------------|

Скомпилируйте вложенные макросы:

 %macro level3 ;
  %put **** START LEVEL3 **** ;
  %local G1;
  %let G1=Local ;

  %do i=1 %to 2 ;
    %put In the macro do loop I=&i ;
  %end ;

  %put The value of I at level3 is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL3 ****;
%mend level3 ;


 %macro level2 ;
  %put **** START LEVEL2 **** ;
  %*global L1 ; *<-- this would produce an error because the variable name has already been added to the local scope in %level1 ;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level3 ;

  %put The value of I in level2 is: &I ;
  %put **** END LEVEL2 ****;
%mend level2 ;

Скомпилируйте макрос верхнего уровня (который в свою очередь вызывает вышеупомянутые два макроса) и запустите его:

%let G1=Global;
%macro level1 ;
  %put **** START LEVEL1 **** ;
  %let L1=Yes;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level2 ;

  %put The value of I outside of the local macro is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL1 ****;
%mend level1 ;
%level1 ;

Примечания, которые следует учитывать при просмотре журнала:

  • За пределами% level3, & I возвращает предупреждение о том, что макропеременная не существует
  • В% level3, когда вызывается & G1, он возвращает значение, сохраненное в локальная область видимости% level3.One за пределами% level3 возвращает значение к значению, хранящемуся глобально
...