Я новичок в SAS и играю с макросами.

Я хочу определить функцию, возвращающую значение истинности, и передать ее в качестве аргумента другой функции, где она используется в %IF. В качестве примера (не работает):

%MACRO truth(datum);
    %PUT datum < 100;
%MEND;

%MACRO use_truth(table, condition);
    %PROC SQL;
        SELECT *
        FROM table
        WHERE %condition(number);
    QUIT;
%MEND

%use_truth(table1 , truth) ;

Где table1 - это таблица SQL с некоторым столбцом number.

Как заставить такую процедуру работать?

sas
1
Daniel Robert-Nicoud 23 Окт 2018 в 17:41

2 ответа

Лучший ответ

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

Когда вы запускаете WHERE %&condition(number); (обратите внимание на амперсанд, чтобы фактически разрешить значение макропеременной), то, что фактически заканчивается процедурой SQL, это WHERE %PUT number < 100;

Вот как вы можете делать то, что хотите, но имейте в виду, что макрос «истина» на самом деле не возвращает значение «да / нет»; он просто записывает этот текст в proc SQL.

%MACRO truth(datum); 
    &datum < 100
%MEND;

%MACRO use_truth(table, condition);
    PROC SQL;
        SELECT *
        FROM &table
        WHERE %&condition(number);
    QUIT;
%MEND;

%use_truth(testInput, truth);

Если вы имеете дело с более сложной логикой, я бы посоветовал изучить proc FCMP. Это позволит вам определять пользовательские функции, которые можно использовать на этапах обработки данных и SQL для обработки.

2
Josh Eller 23 Окт 2018 в 16:05

Макрос, который генерирует встроенный код для использования как часть другого оператора, сам по себе не может вызывать выполнение какого-либо шага (Proc или Data)

Вы можете передать имя макроса другому макросу и вызвать его после его разрешения.

%macro dispatch (macro_name);
  %&macro_name
%mend;

%macro a;
  %put NOTE: Aaaaaaay!;
%mend;

%dispatch (a)
2
Richard 23 Окт 2018 в 15:49
52951832