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;