我最近遇到的SAS代码看起来像这样:
%if var_name ~= %then %do;
flag = 1;
%end;
我理解~=
表示“不相等”,但此处似乎没有任何内容可供比较。有人可以对这种语法有所了解吗?
我已经排除了识别缺失观察结果的简写的可能性:无论var_name
是否包含任何缺失的观察结果,都会生成标记。话虽如此,它与您认为实际上会执行此操作的代码完全相同:
%if var_name ~= . %then %do;
flag = 1;
%end;
上述内容还会为所有观察结果生成值为1的标记。
对此我提供的任何帮助都非常感谢,因为我对SAS很陌生!
答案 0 :(得分:2)
Bestimate:宏表达式发出flag=1;
作为无条件的DATA步骤语句。
"参加SAS代码"可以在一个独特的奖励体验的连续体的任何地方进入一个深黑色的地方。
摘录
%if var_name ~= . %then %do;
flag = 1;
%end;
的构造与正在学习宏并且尚未在SAS会话中查看范围和环境的人保持一致。宏变量和语句不与运行数据步骤变量和语句混合。宏编程通常控制最终被视为需要运行的DATA或PROC步骤源代码。
该片段可能有正当理由,并在其中开始您的旅程。
%IF expression %THEN statement;
涉及macro logical expression的解决方案。
隐式解析 表达式 并将其评估为零(false)或非零(true)。在宏评估时无法解析为非缺失数值的表达式将记录错误:
注意:在SAS执行程序编译并执行DATA步骤时,宏评估时间早已过去。 SAS Documentation非常棒,请使用它!。
您的var_name ~=
表达式始终为真。
%put NOTE: %nrstr(%eval(var_name ~=)) resolves to %eval(var_name ~=);
----
NOTE: %eval(var_name ~=) resolves to 1
由于%IF 表达式 始终解析为true,因此%THEN 语句 始终已解析并作为SAS执行器要使用的源代码。
因此,在您的情况下,源代码flag = 1;
被发出,表面上是作为DATA步骤的一部分,其中标志分配是无条件的。
很多时候 语句 是另一个不发出任何内容的宏表达式,而是执行影响当前宏范围的宏状态的操作 - 例如{ {1}}。
你注意到的那些陈述是关于%IF是否正确以及它应该是什么的真实线索。它可能是什么?
处理的数据集实际上是否有一个名为var_name的列?
也许您正在处理Proc CONTENTS,SQL DICTIONARY.COLUMNS输出的元数据,或者在使用控制数据生成语句的框架中工作
一个goofup,其中 %if - %然后 应该是一个数据步骤 if -then 并且var_name应该已替换为正在处理的数据集中找到的实际变量名。
在代码生成框架中工作,其中表示数据步骤变量的非空符号用于生成数据步骤if-then语句
这段代码是疯子,疯狂天才或乡村白痴的作品。
快乐的编码!