PROC FCMP在指定应存储已编译函数/子例程的输出数据集时需要三级参数。 但是当使用这些编译函数时,SAS需要为全局选项CMPLIB提供两级参数。
文档说:
注意:子程序和函数名在包中必须是唯一的。然而, 不同的包可以具有相同名称的子例程和函数。选择 有歧义时的特定子程序,用子程序预先填充子程序名 包名称和句点(。)例如,要获取反向的MthFncs版本, 使用MthFncs.inverse
但我无法重现这种行为。在做的时候:
proc fcmp outlib=work.functions.pkg1;
function test(var1, var2);
return (var1+var2);
endsub;
run;
proc fcmp outlib=work.functions.pkg2;
function test(var1, var2);
return (var1*var2);
endsub;
run;
option cmplib=work.functions;
data _null_;
a=test(3,3);
b=pkg1.test(3,3);
c=pkg2.test(3,3);
put a= b= c=;
run;
程序崩溃并说:
ERROR: DATA STEP Component Object failure. Aborted during the COMPILATION phase.
31 b=pkg1.test(3,3);
_________
557
ERROR 557-185: Variable pkg1 is not an object.
这不是打算使用包的方式吗?难道我做错了什么?看起来像是:)但我看不清楚。 谢谢!
答案 0 :(得分:2)
看起来package.function()规范目前仅在proc fcmp中有效,而不在数据步骤中。例如,这可行(在创建函数之后):
proc fcmp;
a=test(3,3);
b=pkg1.test(3,3);
c=pkg2.test(3,3);
put a= b= c=;
run;
答案 1 :(得分:1)
以下白皮书说,没有办法让datastep在单个datastep中使用多个包中的同名函数(第15页“存储和共享功能”标题下):
http://support.sas.com/resources/papers/proceedings09/147-2009.pdf
但它确实提供了一些替代建议。
干杯 罗布
PS - 确保你签出runsubmit.com - 这就像堆栈溢出一样,只是针对SAS相关的问题。