2015-07-28 1 views
3

Например, у меня есть макропрограммаТестирование пустого параметра в SAS Macro

%macro test(parameter1= , parameter2=, parameter3=); 
    DATA data_gender; 
    SET data_input(WHERE=(gender=parameter3)); 
    RUN; 
    ..... 
%mend; 

В принципе, я сделал выбор наблюдений с использованием параметр3 (мужчина или женщина). Теперь я хочу создать третий вариант: сохранить оба наблюдения в Male и Female, когда параметр3 пуст (без объявления значения этого параметра).

%test(parameter1=xxx , parameter2=yyy, parameter3=); 

Можете ли вы рассказать мне, как я могу это сделать, пожалуйста?

ответ

4

Для этого ответа я приведу оригинальную бумагу Чанг Чун, "Is This Macro Parameter Blank", так как она отличная и подробно рассказывает о ваших вариантах здесь.

Далее следует «наилучшая» опция (то есть, используя рекомендуемый метод из вышеприведенной работы). Обратите внимание, что начальный макрос %test не возвращает никаких строк для пустого параметра, а второй - %test2.

Простые способы проверки того, что макрос параметр пуст, который работает в большинстве случаев, и читайте бумагу для более подробной информации о более простых вариантах.

%macro test(parameter1= , parameter2=, sex=); 
    DATA data_gender; 
    SET sashelp.class(where=(sex="&sex.")); 
    RUN; 
%mend; 

%test(sex=M); 
%test(sex=F); 
%test(sex=); 

%macro test2(parameter1= , parameter2=, sex=); 
    DATA data_gender; 
    SET sashelp.class(
    %if %sysevalf(%superq(sex) ne,boolean) %then %do; 
     where=(sex="&sex.") 
     %end; 
    ); 
    RUN; 
%mend; 

%test2(sex=M); 
%test2(sex=F); 
%test2(sex=); 
+0

Thanks Joe it works. Но я не понимаю функции% sysevalf и% superq. Не возвращает% sysevalf значение 0 или 1? Почему он может стоять отдельно в блоке состояния? Как он может работать, если я скажу (если 1 затем делать ...). – buiquanghai

+0

0 или 1 является ложным или истинным в SAS. Прочтите связанный документ для получения более подробной информации об этих конкретных функциях (или, если вы все еще не понимаете, не стесняйтесь задавать новый вопрос о том, как эти функции работают!) – Joe

4

Согласен с ответом Джо. Один из хороших моментов, которые они делают в этой статье, - это тестирование на пустое, и их тест вернет значение, является ли параметр нулевым или имеет пробелы в нем. Иногда полезно иметь тест, который различает параметр, который является нулевым, и тот, у которого есть пробелы. В документе упоминается %length(%superq()) как возможный тест для null. Например, ниже, это позволяет указать пустое значение для пола и получить другой результат, чем вы, когда секс равен нулю.

data class; 
    set sashelp.class; 
    if _n_=1 then sex=''; 
run; 

%macro test2(parameter1= , parameter2=, sex=); 
    DATA data_gender; 
    SET class(
      %if %length(%superq(sex)) %then %do; 
       where=(sex="&sex.") 
      %end; 
      ); 
    RUN; 
%mend; 

%test2(sex=) 
%test2(sex=%str())