【问题标题】:Testing for an empty parameter in a SAS Macro测试 SAS 宏中的空参数
【发布时间】:2015-10-19 14:15:45
【问题描述】:

例如,我有一个宏程序

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

基本上,我使用参数 3(男性或女性)进行了一系列观察。现在我想创建第三个选项:当参数 3 为空时(不声明此参数的值),将观察结果保留在男性和女性中。

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

你能告诉我我该怎么做吗?

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    对于这个答案,我将引用 Chang Chung 的开创性论文 "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=);
    

    【讨论】:

    • 感谢乔,它有效。但我不明白函数 %sysevalf 和 %superq 。 %sysevalf 不是返回值 0 还是 1?为什么它可以在条件块中独立存在?如果我说(如果 1 然后做...),它怎么能工作。
    • 0 或 1 在 SAS 中为假或真。阅读链接的论文以获取有关这些特定功能的更多详细信息(或者,如果您仍然不理解,请随时提出有关这些功能如何工作的新问题!)
    【解决方案2】:

    同意乔的回答。他们在论文中提出的一个好处是他们正在测试空白,无论参数为空还是其中有空白,他们的测试都将返回 true。有时进行测试以区分为空的参数和具有空白的参数是有用的。该论文提到 %length(%superq( )) 作为 null 的可能测试。例如下面的例子,这允许您为 sex 指定一个空白值,并获得与 sex 为 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( ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      相关资源
      最近更新 更多