SAS: вызов одного макроса из другого ... порядок определений макросов
в моем коде у меня есть несколько макросов. Макрос A является основным макросом. Макрос вызывает макрос B, который в свою очередь вызывает макрос С.
в SAS, я должен определить их в обратном порядке? Другими словами, должен ли я сначала определить макрос C, затем макрос B, затем макрос a? Или это имеет значение, так как SAS считывает весь код, прежде чем он фактически попадает в команду для запуска макросов? Если на то пошло, могу ли я выполнить команду для запуска макроса в качестве первого оператора в моем коде, а затем определите макросы под командой?
спасибо!
4 ответов
во-первых, вы должны определить макрос, прежде чем он называется.
во-вторых, не имеет значения, где вызывается макрос, если вы загрузили его раньше.
подробнее о вашей проблеме: библиотека autocall-ваш друг. Если администратор SAS не позволяет поместить макросы в библиотеку autocall, можно добавить автозвонок следующим образом:
filename mymacros 'c:\mysas';
/*this defines the directory you have stored your macros*/
options sasautos=(sasautos mymacros) mautosource;
макрос должен быть определен до его вызова. по соображениям производительности лучше не определять макрос внутри другого-если вы это сделаете, то он будет повторно определен каждый раз, когда вы вызываете внешний макрос. отлично работает следующее:
%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
*/
вы должны определить макрос до его вызова, поэтому строка с "%A " должна следовать определению макроса A. порядок других определений макросов не имеет значения, если они определены до их вызова. Обычно в моих программах я настраиваю основной макрос, как вы описываете, затем последняя строка программы вызывает этот макрос.
другой вариант, который следует рассмотреть, - это настройка библиотеки автосопровождения макросов, которая содержит определения многих макросов. Эта работа лучше всего подходит для многоразовых макросов, так что вам не придется переопределять их в каждой программе.
в 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 возвращает предупреждение, которое делает переменная macro не существует
- в %level3 при вызове &G1 возвращается значение, хранящееся в локальная область %level3.После выхода за пределы %level3 значение возвращается к значению, хранящемуся глобально