PATHNAME()
和GETOPTION()
函数为SASAUTOS
返回不同的结果,使人怀疑用于AUTOCALL的目录。 SASAUTOS
是否存在,因为两个不同的“事物”具有相同的名称?
为了提供一些背景知识,我为个人实用程序宏维护了一个目录,其路径已添加到我的配置文件中。
-SET SASAUTOS (
"!SASROOT\core\sasmacro"
"!SASROOT\aacomp\sasmacro"
"!SASROOT\accelmva\sasmacro"
"!SASROOT\assist\sasmacro"
"!SASROOT\dmscore\sasmacro"
"!SASROOT\ets\sasmacro"
"!SASROOT\gis\sasmacro"
"!SASROOT\graph\sasmacro"
"!SASROOT\hps\sasmacro"
"!SASROOT\iml\sasmacro"
"!SASROOT\or\sasmacro"
"!SASROOT\qc\sasmacro"
"!SASROOT\stat\sasmacro"
"C:\USERS\ME\PERSONAL AUTOCALL"
)
这表现得如预期。当我加载SAS时,我可以调用PERSONAL AUTOCALL
目录中的任何宏。
我还运行一个复杂的过程,需要大量特定于问题的宏。它们位于与PERSONAL AUTOCALL
不同的目录中。由于这些宏应该独立于运行该进程的任何人而可用,因此它们不包含在配置文件中。相反,我让SAS从会话中将目录加载到自动调用搜索层次结构中。我这样做是通过发表以下声明。
options mautosource mrecall sasautos = (SASAUTOS, 'Z:\Path\To\COMPLEX PROCESS AUTOCALL');
同样,这表现得如预期。当第一个参数SASAUTOS
从options语句中排除时,只能调用COMPLEX PROCESS AUTOCALL
个宏,反之亦然。
当我监视自动调用搜索层次结构中的目录时,会出现问题。为此,我发出:
%put %sysfunc(pathname(sasautos));
这将返回上面给出的配置文件中给出的精确列表。它缺少COMPLEX PROCESS AUTOCALL
路径,尽管SASAUTOS=
选项已包含它并且这些宏可以调用。
如果我改为发出
%put %sysfunc(getoption(sasautos));
然后返回以下内容。
(SASAUTOS, "'C:\Path\To\COMPLEX PROCESS AUTOCALL'")
虽然两个%put
语句的组合提供了我认为是自动调用库的完整列表,但我不知道为什么需要它们。
PATHNAME()返回数据库的名称,在本例中为SASAUTOS
,应该附加COMPLEX PROCESS AUTOCALL
,至少在当前会话的上下文中。
GETOPTION()返回SAS系统选项的值。显然,系统选项与数据库不同。
不同的返回值确实意味着存在两个不同的SASAUTOS
“事物”,一个是库,另一个是选项?如果是这样,他们如何互动?鉴于这种意外的差异,我如何确定搜索的其他目录没有列出的目录?
答案 0 :(得分:1)
是的,SASAUTOS
是两件事。这是一个system option and a fileref。 (请注意,它不是一个库;它在很多方面与库中的不同,但它不是一个。显然,你不能在SASAUTOS中引用SAS数据集使用普通的点符号。)
默认情况下,会从配置中的SASAUTOS
选项(或启动时的选项)创建fileref SASAUTOS
,并将OPTION SASAUTOS
设置为最初指向(并且仅限于此)。请参阅上面链接的文档页面:
SAS自动生成名为SASAUTOS的fileref。这是SASAUTOS =选项的默认值,并指向所有SAS自动调用宏。
重要的是不要乱用它,因为SAS使用它来定位系统宏。您欢迎在配置中添加fileref的路径,但请确保您不要将其从SASAUTOS选项中删除。
要做你想做的事情,我会说你有三个选择。
一种是将GETOPTION与PATHNAME结合起来,如您所见;您只需要使用PATHNAME的结果附加GETOPTION的结果。实际上,你可以自动化它;使用GETOPTION,然后如果任何结果看起来像filerefs(8个字符或更少,没有点或\或其他)运行PATHNAME并附加结果。
两个是从fileref中删除您的个人宏库,而是将其附加到您的autoexec中。但是,您必须小心,然后在附加其他库时始终附加它。
三是制作第二个 fileref,并将任何附加路径附加到该fileref。这很好,因为您可以确定OPTION SASAUTOS
只有两个值(fileref SASAUTOS
和MYAUTOS
fileref),然后您只需将新文件附加到该值(使用PATHNAME
获取当前加载的路径,然后添加到该路径,然后重新定义fileref)。这可能是最容易维护的,只要你小心总是正确地重新定义它(创建一个宏(!)来做到这一点......)
它还具有以下优点:其他程序员可以简单地创建自己的核心fileref,程序仍然适用于他们(如果他们有不同的宏库),当然他们的宏库最好包含项目所需的宏