4

我正在尝试通过定义一个名为 root 的宏变量来组织我的 SAS 代码。然后,我希望能够让我的所有%INCLUDE语句都使用该&root值,这样我就可以%INCLUDE根据根来定义:

%LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
%include "&root\lib\work.sas"

但是,当尝试在 SAS 9.2 下运行时,我从日志中收到以下错误:

1    %LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
ERROR: Incorrect %INCLUDE statement will not be executed. There is a syntax error.
2    %include "&root\lib\work.sas"

所以看起来&root变量没有被扩展为%INCLUDE语句中的值。我究竟做错了什么?

谢谢!

[编辑]答案

';'我在声明的末尾错过了%INCLUDE。=/

4

3 回答 3

4

在这种情况下,您可能需要使用分隔符,它标记宏变量名称的结尾,即“.”,因此您的代码将如下所示:

%LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
%include "&root.\lib\work.sas"

这实际上只有在变量名“触及”某些东西时才需要,但我建议总是使用它——这是一个很好的做法。此外,当变量名后面有一个点时,你应该放“那个”点,所以会有两个点,比如:

%LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
%LET fname = work;
%include "&root.\lib\&fname..sas"

编辑

正如@Joe 在其他答案中正确指出的那样,这种情况下的真正问题是%INCLUDE语句后缺少分号。将它放在路径之后应该可以解决问题。

于 2012-09-18T17:44:34.747 回答
3

我不得不说我对您对错误的介绍以及您接受的答案感到有些困惑。以我的经验,ERROR: Incorrect %INCLUDE statement将出现在第二行之后,而不是之前。另外,如果宏变量分辨率是问题,那么您会看到以下内容:

903  %LET root = C:\temp;
904
905  %include "&roots\test.sas";
WARNING: Apparent symbolic reference ROOTS not resolved.
WARNING: Physical file does not exist, C:\Users\xxxx\&roots\test.sas.
ERROR: Cannot open %INCLUDE file &roots\test.sas.

在您包含的代码中,%include 后没有分号。这可能与问题有关吗?当我运行 %include 然后另一行是非法的,例如以相反的顺序运行它们时,我确实得到了那个错误(尽管仍然在 %include 之后)。

于 2012-09-19T18:02:45.977 回答
2

我怀疑您的代码中此语句之前的某个地方还有另一个错误。尝试重新启动 SAS 并仅执行这两行代码,它应该可以正常工作,对我来说效果很好

%let root = c:\documents and settings\robert.penridge\desktop\mine\sas;
%include "&root\lib\work.sas";

编辑:这对我有用,因为我实际上添加了一个分号。在@Joe 正确诊断问题后意识到这一点。

我在桌面上创建了以下文件夹结构:

\mine\sas\lib

然后把 work.sas 放在那里,内容如下:

%put blah;

当我运行代码时,结果打印blah得很好,没有错误消息。事实上,多年来,我在许多版本的 SAS 和许多操作系统中都使用过这样的代码。你的代码没有问题。

与此处其他一些答案的建议相反,SAS 足够聪明,知道该\字符不能成为宏名称的一部分,因此无需用.字符显式声明宏的结尾。

最后,如果您尝试调试宏代码,您还可以打开以下选项:

option mprint mlogic macrogen symbolgen source source2;

您可以像这样将它们关闭:

option nomprint nomlogic nomacrogen nosymbolgen nosource nosource2;

请注意,其中一些可能已经在您的 SAS 环境中默认启用。

在极少数情况下,您可能还会遇到宏引用问题。如果您一直在使用诸如%str() %bquote()etc 之类的宏函数,则会发生这种情况......如果是这种情况,那么通常可以通过使用%unquote()导致问题的宏变量周围的函数来解决它。从您的代码示例看来,这不是问题所在,但您可能已经简化了帖子的代码。如果是这种情况,那么在您的情况下,代码将更改为如下所示:

%let root = c:\documents and settings\robert.penridge\desktop\mine\sas;
%include "%unquote(&root)\lib\work.sas";
于 2012-09-19T17:02:15.270 回答