将宏函数作为参数传递给另一个宏函数

时间:2018-10-23 14:41:49

标签: sas

我是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是一个带有某些列number的SQL表。

如何使这样的程序起作用?

2 个答案:

答案 0 :(得分:2)

要记住的重要一件事是宏只是文本替换,它们在任何代码执行之前就运行了。宏不会像这样返回值,它们只是返回代码。

当您运行WHERE %&condition(number);(请注意要使用&号实际解析宏变量的值)时,proc 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。这样一来,您就可以定义可在数据步骤和proc SQL中使用的自定义函数。

答案 1 :(得分:2)

正在生成内联代码以用作另一条语句的一部分的宏本身本身不会导致发生任何形式的步骤(过程或数据)

您可以将宏名称传递给另一个宏,并在解析后调用它。

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

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

%dispatch (a)