首页 > 解决方案 > 如何申请macroin sas?

问题描述

将下面显示的程序提交到编辑器窗口并检查结果。

    %macro id(num);

    proc print data=maps.algeria label noobs;

    var x y ;

    where id=#

    title "Projected Longitude and Latitudes for Id &num";

    run;

    %mend id;

    %id(2)

修改宏,使其仅在 NUM 参数值介于 1 和 9 之间时提交 PROC PRINT 步骤。如果超出范围,宏应将以下消息写入 SAS 日志:

找不到身份证号码。提供的值为:x

x 的值是 NUM 参数值。

· 重新提交宏并使用有效和无效的参数值调用并检查结果。

我试过这个

%macro ides(num);
%let id=%num;


%if  &num le 9 %then %do;

proc print data=maps.algeria label noobs;

var x y ;

where id=#

title "Projected Longitude and Latitudes for Id &num";

run;

%end;

%else

%do; 

%put Id Number not found. And supplied value was: #

run;

%end;

%mend ides;

标签: if-statementsasmacroskeyword

解决方案


看起来还不错。有几件事。

首先,您已将宏定义为 IDES。所以在你的测试中使用这个名字。要对其进行测试,您需要多次调用它以查看它对于不同类型的输入是否按预期工作。就像是:

%ides(1)
%ides(9)
%ides(8)
%ides(123)
%ides(0)

您发布的代码有一些问题。

首先,您不需要宏的第一行。

%let id=%num;

无需创建另一个与 NUM 具有相同值的宏变量。另外,这不是您引用宏变量 NUM 的方式。您使用&触发宏处理器来查找宏变量。%用于查找宏而不是宏变量。因此该代码试图执行一个名为 NUM 的宏,而不是返回名为 NUM 的宏变量的值。您尚未使用该名称定义任何宏。

由于未测试 ID 有效值范围的下限,您已经错过了部分要求。当您尝试调用将 NUM 设置为 0 或负数的宏时,您应该会看到这一点。

 %if &num ge 1 and &num le 9 %then %do;

如果您尝试为 NUM 传递非整数值,则会检测到更微妙的问题。或者根本不能解释为数字的字符串。

 %ides(4.5)
 %ides(fred)

如果 ID 的值可以是非整数,那么您在宏 %IF 语句中的值测试将需要调用 %SYSEVALF() 函数。如果 SAS 将仅使用 %EVAL() 函数来评估 %IF 的条件,则 %EVAL() 只能进行整数运算,不能进行浮点运算。

 %if %sysevalf(&num ge 1 and &num le 9) %then %do;

推荐阅读