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 函数应该修复消息并给出所需的结果。
谁能解释一下我用 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)
,结果为 falsesubstr(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 函数应该修复消息并给出所需的结果。