Sas 在PROC FCMP中散列数据时没有保证的libname
我正在使用SAS的PROC FCMP编写一些用于重新编码的函数。这些将保存在共享目录中的数据集中,以便我的同事可以使用它们。大多数情况下,这些函数只是包装器,用于散列同一目录中的查找表 简化示例: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
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$)
。这样,我还可以将库传递给嵌套函数,这些函数也需要知道在哪里查找。