Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sas 在PROC FCMP中散列数据时没有保证的libname_Sas_Hashtable_Fcmp - Fatal编程技术网

Sas 在PROC FCMP中散列数据时没有保证的libname

Sas 在PROC FCMP中散列数据时没有保证的libname,sas,hashtable,fcmp,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; Functi

我正在使用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;

除了坚持每个人都使用相同的libname之外,还有什么方法可以确保这些函数始终工作吗?

因为
数据集
是一个字符串,所以可以在运行时确定。因此,您可以将其作为参数传递给函数-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;

函数语句中的DSET之后需要$TACH。@Tom很好,我喜欢可运行示例的一个原因(我有空时会制作一个)@Joe这个答案行得通,但我希望有比在每个查找函数中添加额外参数更优雅的东西。由于数据集名称是可靠的,我认为提供包含数据的库就足够了:
函数recode_foo(foo,lib$)
。这样,我还可以将库传递给嵌套函数,这些函数也需要知道在哪里查找。