SAS - 如何确定SASAUTOS中的库

时间:2017-05-31 13:07:34

标签: sas

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“事物”,一个是库,另一个是选项?如果是这样,他们如何互动?鉴于这种意外的差异,我如何确定搜索的其他目录没有列出的目录?

1 个答案:

答案 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 SASAUTOSMYAUTOS fileref),然后您只需将新文件附加到该值(使用PATHNAME获取当前加载的路径,然后添加到该路径,然后重新定义fileref)。这可能是最容易维护的,只要你小心总是正确地重新定义它(创建一个宏(!)来做到这一点......)

它还具有以下优点:其他程序员可以简单地创建自己的核心fileref,程序仍然适用于他们(如果他们有不同的宏库),当然他们的宏库最好包含项目所需的宏