在PROC FCMP中散列数据时,无法保证libname

时间:2016-09-21 19:45:22

标签: sas hashtable fcmp

我正在使用SAS'PROC FCMP编写一些用于重新编码的函数。这些将保存在共享目录中的数据集中,因此我的同事可以使用它们。大多数情况下,函数只是在同一目录中散列查找表的包装器。

简化示例:

Libname OurStuff "path/to/shared/data";

DATA OurStuff.foobar;
    foo = 1;
    bar = 2;
Run;

PROC FCMP outlib = OurStuff.functions.lookup;
    Function recode_foo(foo);
        Length bar 8;
        Declare hash foobar(dataset: "OurStuff.foobar");
        rc = foobar.defineKey("foo");
        rc = foobar.defineData("bar");
        rc = foobar.defineDone();
        rc = foobar.find();
        Return(bar);
    Endsub;
Run;

该函数适用于原始libname:

Options cmplib = OurStuff.functions;
DATA _NULL_;
    result = recode_foo(1);
    Put result =;
Run;

但如果有人使用不同的libname,则不会:

Libname OurStuff clear;
Libname WildName "path/to/shared/data";
Options cmplib = WildName.functions;

/* Results in "ERROR: Libref OURSTUFF is not assigned" */
DATA _NULL_;
    result = recode_foo(1);
Run;

除了坚持每个人都使用相同的libnames之外,还有办法确保这些功能始终有效吗?

1 个答案:

答案 0 :(得分:3)

由于dataset是一个字符串,因此可以在运行时确定。因此,您可以将其作为参数传递给函数 - libname或(更好)整个数据集字符串。

PROC FCMP outlib = OurStuff.functions.lookup;
    Function recode_foo(foo,dset $);
        Length bar 8;
        Declare hash foobar(dataset: dset);
        rc = foobar.defineKey("foo");
        rc = foobar.defineData("bar");
        rc = foobar.defineDone();
        rc = foobar.find();
        Return(bar);
    Endsub;
Run;