什么是使用PROC FCMP的包?

时间:2010-10-25 16:47:44

标签: sas

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.

这不是打算使用包的方式吗?难道我做错了什么?看起来像是:)但我看不清楚。 谢谢!

2 个答案:

答案 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相关的问题。