ifc 函数的行为

Behavior of ifc function

谁能解释一下我用 ifc 函数观察到的奇怪行为:

我运行以下3个测试:

data test1;
  var = "    "; /* 4 spaces */
  length outvar ;
  if not missing(var) then outvar = substr(var, 1,5);
  else call missing(outvar);
  put outvar=;
run;

data test2;
  var = "    "; /* 4 spaces */
  length outvar ;
  outvar = ifc(not missing(var), substr(var, 1, 5), "");
  put outvar=;
run;

data test3;
  var = "     "; /* 5 spaces */
  length outvar ;
  outvar = ifc(not missing(var), substr(var, 1, 5), "");
  put outvar=;
run;

test1 和 test3 运行 很好。但是我得到以下 warning/note 的 test2: Invalid third argument to function SUBSTR

虽然我明白这句话的意思,但不清楚为什么它会被触发,因为它不应该在 ifc 函数中计算该表达式。似乎 ifc 函数正在评估两个表达式,而不管逻辑测试的结果如何。

SAS 不使用惰性求值。

在应用 ifc 之前,SAS 计算其所有参数,

所以如果你提交

data test2;
  var = "    "; /* 4 spaces */
  length outvar ;
  outvar = ifc(not missing(var), substr(var, 1, 5), "");
  put outvar=;
run;

SAS 将评估

  • not missing(var),结果为 false
  • substr(var, 1, 5),会报错
  • "",结果为空字符串

所以错误发生在ifc执行之前。

但是如果你提交

data test1;
  var = "    "; /* 4 spaces */
  length outvar ;
  if not missing(var) then outvar = substr(var, 1,5);
  else call missing(outvar);
  put outvar=;
run;

SAS 将计算 not missing(var),结果为 false。 接下来会[=​​20=]

  • 不评价substr(var, 1, 5)
  • 但仅计算 "",结果为空字符串

IFC/N 计算所有参数中的所有表达式。 SUBSTRN 函数应该修复消息并给出所需的结果。