我尝试编写一个用户定义的函数MinDis()
并将其应用于数据步骤,该函数用于计算从一个点到(数值)数组的每个元素的最小距离。代码错误:
proc fcmp outlib = work.funcs.Math;
function MinDis(Exp,Arr[*]);
array dis[2] /symbols;
call dynamic_array(dis,dim(Arr));
do i = 1 to dim(Arr);
dis[i] = abs((Exp - Arr[i]));
end;
return(min(of dis[*]));
endsub;
quit;
option cmplib=work.funcs ;
data MinDis;
input LamdazLower LamdazUpper @;
cards;
2.50 10.0
2.51 10.8
2.49 9.97
2.75 9.50
;
run;
data _null_;
set ;
array _PTN_ [14] _temporary_ (0.5,1,1.5,2,2.5,3,4,5,6,7,8,9,10,12);
StdLamZLow = MinDis(LamdazLower,_PTN_);
StdLamZUpp = MinDis(LamdazUpper,_PTN_);
put _all_;
run;
编译正确,但给出了错误的结果。 StdLamZLow
仅获得从LamdazLower
到数组_PTN_
的前两个元素的最小距离。
当我将dis
的暗号重写为999或非常大的值,并且摆脱call dynamic_array
的声明时,我会做对了。但是我当然想知道为什么min(of dis[*])
只将dis
当作2维数组。
顺便说一句,如何使用隐式DO循环do over ...
代替显式DO循环?我已经尝试过几次了,但是还没有成功。
感谢任何提示。