if-statement - 如何申请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;
解决方案
看起来还不错。有几件事。
首先,您已将宏定义为 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;
推荐阅读
- r - 带有 c(pattern1 = replacement1) 选项的 stringr::str_replace_all 的基本 R 替代方案
- sqlalchemy - 使用 SQLAlchemy,我如何仅使用 json 更新数据库?
- javascript - 在 Nuxt 中从 .env 设置开发或生产 api URL
- sql - 如果满足多个条件,则从同一个表中的行中复制数据
- python - 如何根据具有相同字段值的对象总数在模型中添加自动增量字段?
- c - 从函数返回后如何将信息保存在结构中?
- dev-c++ - 从 Dev C++ 项目中删除文件
- javascript - 将已解决的承诺返回到另一个文件
- batch-file - 用用户输入的文本替换文件/目录名称
- c# - 在 C# 中创建一个类数组