尽管if语句为FALSE,但变量已初始化并显示在ODS中

时间:2019-04-25 15:39:14

标签: sas

我在IF-statement程序中实现了SAS,该程序基本上检查了一年比较的有效性。如果IF-statementTRUE,则一些其他变量将被初始化和计算,如果IF-statementFALSE,则什么也不会发生。

但是,我刚刚意识到无论IF-statementTRUE还是FALSE,附加变量都会被初始化(尽管{{1}中的MISSING }大小写),并显示在FALSE中。这是为什么?有直接的解决方法吗?我当然可以使用条件ODS,但是总要添加它似乎很乏味。

drop-statement

编辑:我再次意识到data test; value = 1; if value > 2019 then a = 1; /* if value < 2019 then do; drop a; end; */ run; 也将始终掉线,无论是否drop-statement

解决方案 ,但不知道它为什么起作用

TRUE/FALSE

在四处寻找时,我发现了this sas-community post。我的问题似乎基本上是由data test; %let value = 1; %if &value. > 2019 %then %do; a = 1; %end; run; 的差异引起的。应用%IF vs IF即可。该帖子似乎已经过期,而不是现在可以在MACRO %IF外使用MACRO %IF的{​​{1}}帖子。

2 个答案:

答案 0 :(得分:3)

这是编译和运行数据步骤之间的区别。在编译数据步骤时(在实际运行之前),SAS会确定它需要哪些变量。由于列a在等式的左侧,因此将其添加到数据集中。请记住,此时,SAS尚不知道您将要放入哪些数据。您可能需要该a列,而您可能不需要。这就是为什么您无法在运行时有条件地添加/删除列的原因。这些列需要在编译时知道。

在第二种情况下,如Tom所指出的,在编译数据步骤之前 对宏表达式进行求值。从SAS的角度来看,您的代码:

data test; 

%let value = 1;
%if &value. > 2019 %then %do; a = 1; %end;

run;

只需对此进行评估:

data test; 

run;

另一方面,此代码:

data test; 

%let value = 2020;
%if &value. > 2019 %then %do; a = 1; %end;

run;

对此进行评估:

data test; 

a = 1;

run;

答案 1 :(得分:1)

MACRO代码和SAS代码是两个不同的系统。宏处理器首先检查代码,然后解释任何宏代码(查找%和&触发器)。然后,结果文本继续显示并被评估为SAS代码。

因此,在第二种情况下,宏处理器会根据宏变量的值生成不同的SAS代码。

还请注意,您的案例正在测试不同的事物。在宏代码中,您正在测试宏变量的值。在数据步骤代码中,您正在测试数据集变量的值(用于特定观察)。