If statement ifc函数的性质
有人能解释一下我用If statement ifc函数的性质,if-statement,sas,lazy-evaluation,If Statement,Sas,Lazy Evaluation,有人能解释一下我用ifc函数观察到的奇怪行为: 我运行了以下3个测试: data test1; var = " "; /* 4 spaces */ length outvar $5; if not missing(var) then outvar = substr(var, 1,5); else call missing(outvar); put outvar=; run; data test2; var = " "; /* 4 spaces */ le
ifc
函数观察到的奇怪行为:
我运行了以下3个测试:
data test1;
var = " "; /* 4 spaces */
length outvar $5;
if not missing(var) then outvar = substr(var, 1,5);
else call missing(outvar);
put outvar=;
run;
data test2;
var = " "; /* 4 spaces */
length outvar $5;
outvar = ifc(not missing(var), substr(var, 1, 5), "");
put outvar=;
run;
data test3;
var = " "; /* 5 spaces */
length outvar $5;
outvar = ifc(not missing(var), substr(var, 1, 5), "");
put outvar=;
run;
test1和test3运行良好。但是,对于test2,我得到了以下警告/注意:
函数SUBSTR的第三个参数无效
虽然我理解这一点的含义,但不清楚为什么会触发它,因为它不应该在ifc
函数中计算该表达式。无论逻辑测试的结果如何,ifc
函数都将计算这两个表达式。SAS不使用延迟计算。
在应用ifc
之前,SAS会计算其所有参数
所以如果你提交
SAS将进行评估
未丢失(var)
,这将导致false
substr(var,1,5)
,它给出了一个错误
”
,其结果为空字符串
因此,错误发生在执行ifc
之前
但是如果你提交
SAS将计算未丢失(var)
,结果为false。
下一步是
- 不评估
substr(var,1,5)
- 但只计算
”
,结果为空字符串
SAS不使用延迟评估。
在应用ifc
之前,SAS会计算其所有参数
所以如果你提交
SAS将进行评估
未丢失(var)
,这将导致false
substr(var,1,5)
,它给出了一个错误
”
,其结果为空字符串
因此,错误发生在执行ifc
之前
但是如果你提交
SAS将计算未丢失(var)
,结果为false。
下一步是
- 不评估
substr(var,1,5)
- 但只计算
”
,结果为空字符串
IFC/N计算所有参数中的所有表达式。SUBSTRN函数应该修复消息并给出所需的结果。IFC/N计算所有参数中的所有表达式。SUBSTRN函数应该修复消息并给出所需的结果。IFC/N计算所有参数中的所有表达式。SUBSTRN函数应该修复消息并给出所需的结果。是否在某个地方记录了此行为?我认为SAS在任何地方都不会对执行的语句中的所有表达式求值。也就是说,SAS不会“短路”。感谢您的输入,这也是为什么LAG在IFC/IFN中有效,而在IF/THEN语句中无效的原因。它有它的优点和缺点。IFC/N计算所有参数中的所有表达式。SUBSTRN函数应该修复消息并给出所需的结果。是否在某个地方记录了此行为?我认为SAS在任何地方都不会对执行的语句中的所有表达式求值。也就是说,SAS不会“短路”。感谢您的输入,这也是为什么LAG在IFC/IFN中有效,而在IF/THEN语句中无效的原因。它有它的优点和缺点。
data test2;
var = " "; /* 4 spaces */
length outvar $7;
outvar = ifc(not missing(var), substr(var, 1, 5), "");
put outvar=;
run;
data test1;
var = " "; /* 4 spaces */
length outvar $5;
if not missing(var) then outvar = substr(var, 1,5);
else call missing(outvar);
put outvar=;
run;