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

Sas 将宏函数作为参数传递给另一个宏函数,sas,Sas,我是SAS的新手,我正在玩宏 我想定义一个返回真值的函数,并将其作为参数传递给另一个函数,该函数在%IF中使用。例如,不起作用: %MACRO truth(datum); %PUT datum < 100; %MEND; %MACRO use_truth(table, condition); %PROC SQL; SELECT * FROM table WHERE %condition(number); QUIT;

我是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表


我怎样才能使这样的程序起作用

需要记住的一点是,宏只是文本替换,它们在任何代码执行之前运行。宏本身不返回值,它们只返回代码

运行WHERE%&conditionnumber;请注意,实际解析宏变量值的符号,proc SQL最终实际看到的是%PUT number<100

下面是您如何做自己想做的事情,但请注意“truth”宏实际上并没有返回yes/no值;它只是将该文本写入procsql

%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中使用的自定义函数。

需要记住的一点是,宏只是文本替换,它们在任何代码执行之前运行。宏本身不返回值,它们只返回代码

%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);
运行WHERE%&conditionnumber;请注意,实际解析宏变量值的符号,proc SQL最终实际看到的是%PUT number<100

下面是您如何做自己想做的事情,但请注意“truth”宏实际上并没有返回yes/no值;它只是将该文本写入procsql

%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中使用的自定义函数。

生成内联代码以用作另一条语句的一部分的宏本身不能导致任何类型的步骤在过程或数据中发生

%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);
可以将宏名称传递给另一个宏,并在解析后调用它

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

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

%dispatch (a)

生成内联代码以用作另一条语句的一部分的宏本身不能导致任何类型的步骤在Proc或Data中发生

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

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

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

%dispatch (a)

首先,您的SQL中没有FROM。是来自&TABLE吗?WHERE子句中的number=datum<100吗?@D.O.是的,我忘了来自表中的一个。当然,将条件放入其中会起作用,但这不是一个真实的情况,我只是想了解如何使其以这种方式工作,以便将其应用于更复杂的情况。要清楚,我希望WHERE子句在编译后变成number<100。首先,您的SQL中没有FROM。是来自&TABLE吗?WHERE子句中的number=datum<100吗?@D.O.是的,我忘了来自表中的一个。当然,将条件放在里面是可行的,但这不是一个真实的情况,我只是想了解如何使其以这种方式工作,以便将其应用于更复杂的情况。要明确的是,我希望WHERE子句在编译后变成number<100。它起作用了,我现在对宏的理解更好了。非常感谢你!它可以工作,我现在对宏的理解更好了。非常感谢你!