2014-10-21 1 views
5

Я бег макрос несколько раз в SAS следующим образом:В SAS выполняется макрос без точки с запятой?

%mymac(a,b); 
%mymac(a,c); 
. 
%mymac(a,a) 
%mymac(a,w); 
. 

Моей программа/макро аналогична:

/* begin program here */ 

data original_data; 
set mylib.mydata; 
run; 

%macro mymac(x,y); 

data mydata1; 
set original_data; 
where school_district="&x"; 
run; 

proc means data=mydata1; 
var income; 
run; 

%mend mymac; 

я понял, что забыл точку с запятой (как в (а, a) один), и SAS, похоже, не возражал. Он без проблем запускал все вызовы макросов. Я сравнил вывод, когда я добавил точку с запятой, и я не мог видеть разницу.

Это нормально, что SAS не дает ошибку с отсутствующей точкой с запятой?

+1

Так что, если я понять все это правильно, я не нужна точка с запятой в конце выше макроса, потому что самое последнее высказывание имеет точку с запятой в нем, так что добавление точку с запятой% mymac (а, а) будет по существу, то же самое, что и набирать run ;; в конце заявления о средствах? – user27008

+1

Да, это точно. –

ответ

3

Обычно это нормально. Главное, что нужно знать о SAS Macro, это то, что это инструмент генерации кода, а не настоящий язык программирования. В то время как %my_mac(x,y); выглядит как традиционный вызов функции на C-подобном языке, где вы хотите закончить каждый оператор ;, здесь завершающий ; не имеет реального значения. Скорее, это код SAS, который создается внутри %my_mac(x,y), который делает. В вашем случае этот код является грамматическим SAS и в порядке. Если вы мысленно замените вызов %my_mac(x,y) кодом, который он генерирует (т. Е. data mydata.....run;), вы увидите, что он является грамматическим даже без окончания %my_mac(x,y) с ;. Если вы написали %my_mac(x,y); вместо этого, он просто сгенерировал бы data mydate.....run;;, что хорошо, но ; является избыточным.

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

%MACRO x_plus_n (x = , y=); 
    %SYSEVALF (&x + &y) 
%MEND; 

%LET x = 3 ; 
%LET y = 4 ; 
%LET z = %x_plus_n (x = &x , y= &y) is the result; 
%PUT ------------- &z; 

Обратите внимание на отсутствие ; на% SYSEVALF линии. Это позволяет макросу не заканчиваться до конца строки %LET z = ...., где есть ;. Результат, созданный x_plus_n, становится видом возвращаемого значения для макроса.

+0

В основном мой макрос создает мой набор данных mydata1 каждый раз, когда он вызывается. Я не лучший с макросами, и я не уверен, что я полностью понимаю ваш пример. – user27008

+3

@sparc_spread - Я сделал пример более значимого путем добавления текста между макровызовым и точкой с запятой. Без дополнительного текста там точка, которую вы пытаетесь сделать, не так очевидна. –

+1

@RobertPenridge - Мне нравится, спасибо! –

2

Макросы - это просто замена текста. Они обычно не являются исполняемыми утверждениями (хотя иногда они могут выполнять инструкции с использованием %SYSFUNC). Таким образом, точка с запятой не требуется после вызова макроса, если она не потребуется после текста, содержащегося в макросе (и фактически не содержится в самом макросе).

И.Е.:

%macro test; 
proc freq data=sashelp.class; 
run 
%mend test; 

должен быть выполнен в виде

%test; 

потому что run не имеет концевую точку с запятой. Если вы положите точку с запятой после run внутри макроса, вы можете запустить ее как %test без точки с запятой.

Сохраните первое предложение выше: Макросы - это просто замена текста. Независимо от того, какой текст создается макросом, затем перебирается в программу SAS и выполняется так, как если бы вы набрали его (возможно, вы использовали %do i=1 %to 100; - поэтому он ставит 100 копий того, что находится в цикле, - но это похоже на то, что вы набрали все 100 себя). Следовательно, необходимость в ; основана на том, нужно ли вам вводить его или нет.

4

Точка с запятой не требуется для вызовов макросов.

Часто они включаются, поскольку люди используются для обозначения точек с запятой как способ «прекращения утверждения» или окончания строки. Я лично предпочитаю включать их, когда это возможно, поскольку, по-моему, это делает мой код более удобочитаемым.

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

Возьмем такой пример, где нет используется точка с запятой:

%macro field_list(); 
    name, 
    age, 
    sex, 
    height 
%mend; 

proc sql; 
    select %field_list() 
    from sashelp.class 
    ; 
quit; 

Попробуйте запустить его на своем компьютере с option mprint; включена. Результат запуска макроса просто возвращает блок кода внутри него. Это приводит к следующему выполняемого кода:

proc sql; 
    select name, age, sex, height 
    from sashelp.class 
    ; 
quit; 

Если бы мы имели точку с запятой после звонка в нашу макросъемки, то код, который SAS будет пытаться запустить будет включать точку с запятой, который был бы неверный синтаксис, как это (примечание точка с запятой после роста):

proc sql; 
    select name, age, sex, height ; 
    from sashelp.class 
    ; 
quit; 

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

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

%macro example2(inDS=, outDs=); 
    data &outDs; 
    set &inDs; 
    run; 
%mend; 

%example2(inDS=sashelp.class, outDs=tmp_class); 

В основном это имеет значение:

data tmp_class; 
    set sashelp.class; 
run;; 

Обратите внимание на дополнительной точках с запятой в конце оставшейся от нашего разговора? Мы могли бы иметь столько, сколько мы хотели и код будет работать нормально, то есть:

%example2(inDS=sashelp.class, outDs=tmp_class);;;;;; 

Преобразуется:

data tmp_class; 
    set sashelp.class; 
run;;;;;;; 

Какие еще будет работать хорошо, как он действует синтаксис.

 Смежные вопросы

  • Нет связанных вопросов^_^