length k d $10;
if _n_=1 then do;
declare hash h()
h.definekey('k');
h.definedata('d');
h.definedone();
call missing('k','d'); /*有什么用?帮助中“avoid unintialized variable notes”不理解具体*/
end;
set ....
run;
1/ call missing 在_n_=1时只执行一次,并且是在hash对象声明结束之后,应该不会对构造hash表有影响。
在版主《sas编程与数据挖掘商业案例》p206提到:“可以实现在没有找到匹配值的时候返回一个空值,如果
没有此选项,系统将会用hash表当前观察之前最近一条值替代当前观察”。想不明白,为什么call missing 不影响
hash表构建,同时只执行一次为什么会起到这样作用?如果是“怕引用前一条值”至少也应该放到if外面。
另外,hash表find时返回的是地址,如果hash表中无相应key值时,应该是不指向任何数据,也即自动返回缺失,
在《programming 3 couse notes》P6-24中的6.05题及6-101的解释中,如果找不到key会返回data步对该变量的初始化值,
而与hash表的前一条记录无关,因此即使要用貌似放在if外更合理点!
2/ call missing 应该只在执行时起作用,而不像drop在初始化时,因此不明白只执行一次有什么作用?
3/ 如果将call missing 放在if条件外同上面有区别吗?
data _null_;
length k d $10;
if _n_=1 then do;
declare hash h()
h.definekey('k');
h.definedata('d');
h.definedone();
end;
call missing('k','d'); /*放在if外同上面有区别吗?*/
set ....
run;
琢磨了半天,还是不明白,望高人指点迷津!多谢了!



雷达卡



我理解的是length+call missing只是搭了一个空变量给hash表进来,call missing放if里是因为节省跑一次就够了,放外面其实没影响。
京公网安备 11010802022788号







