在 PROC FCMP 中散列数据时没有保证的 libname
No guaranteed libname when hashing data in PROC FCMP
我正在使用 SAS 的 PROC FCMP 编写一些用于重新编码的函数。这些将保存在共享目录中的数据集中,以便我的同事可以使用它们。大多数时候,这些函数只是在同一目录中散列查找 table 的包装器。
简化示例:
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;
该函数适用于原始库名:
Options cmplib = OurStuff.functions;
DATA _NULL_;
result = recode_foo(1);
Put result =;
Run;
但是如果有人使用不同的库名,它不会:
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;
除了坚持每个人都使用相同的库名之外,有没有办法确保这些功能始终有效?
由于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;
我正在使用 SAS 的 PROC FCMP 编写一些用于重新编码的函数。这些将保存在共享目录中的数据集中,以便我的同事可以使用它们。大多数时候,这些函数只是在同一目录中散列查找 table 的包装器。
简化示例:
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;
该函数适用于原始库名:
Options cmplib = OurStuff.functions;
DATA _NULL_;
result = recode_foo(1);
Put result =;
Run;
但是如果有人使用不同的库名,它不会:
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;
除了坚持每个人都使用相同的库名之外,有没有办法确保这些功能始终有效?
由于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;