SAS宏引用未解析

SAS宏引用未解析,sas,sas-macro,Sas,Sas Macro,我的代码中有宏,它们是按随机顺序创建和使用的 它显示“%put&pincuk”的“reference not resolved”,以及“&pincuk”的语法错误。当我运行两次代码时,它工作正常。我猜它发生在SAS在宏创建之前到达&pincuk时。比如说, data x.fcastukcalc; do day=&daycountuk + 1 to &daycountkorea retain fcast &ukdmax; fcast=(fcast * &pincu

我的代码中有宏,它们是按随机顺序创建和使用的

它显示“%put&pincuk”的“reference not resolved”,以及“&pincuk”的语法错误。当我运行两次代码时,它工作正常。我猜它发生在SAS在宏创建之前到达&pincuk时。比如说,


data x.fcastukcalc;
do day=&daycountuk + 1 to &daycountkorea
retain fcast &ukdmax;
fcast=(fcast * &pincuk) + fcast;
output;
end;
run;



/* then this, later on */

data _null_;
keep deathsuk inc1 inc2 pinc1 pinc2 pinc;
set x.uk;
inc1=deathsuk - lag1(deathsuk);
pinc1=(inc1 / lag1(deathsuk));
inc2=lag1 (deathsuk) - lag2(deathsuk);
pinc2=(inc2 / lag2(deathsuk));
pinc=(pinc1 + pinc2) / 2;
call symputx('pincuk', pinc);
run;

%put &pincUK;




如果在第一次运行时,
x.uk
不存在或没有行,
调用symputx('pincUK',pinc)将永远无法访问。因此,在代码运行的“随机”情况下,让我们更慷慨地说,在一个发展的情况下,您的期望可能已被错误记忆的操作或微妙的状态变化所颠覆。检查代码中的
%SYMDEL
语句。在开发大型宏的过程中,您可能提交了宏内部的部分内容,而没有完整的“模拟”在实际调用宏期间预期存在的状态

启动新的SAS会话,查看代码问题是否仍然存在,是否可以更直接地重现

具体来说,您的问题是关于宏符号的,通常称为宏变量。宏本身是SAS编程语句组的名称

SAS编译程序文本时,两个分隔符触发宏处理器活动:

&名字

  • 指一个宏变量。说明如何创建宏变量。表单名称称为宏变量引用(&N)
%名字

  • 指一个宏。说明如何创建宏。表单%name称为宏调用
宏处理器生成的文本替换在编译和执行程序文本之前完成。宏工具使用的语句和函数与数据步骤中使用的语句和函数相似。然而,一个重要的区别是宏语言元素只能启用文本替换,并且在程序或命令执行期间不存在

------编辑(新增)------

编写包含大量抽象(即宏变量)的代码需要一定程度的规程和系统设计。在调用宏之前,必须对其进行编译,但是它在其中解析的宏变量(即符号)不需要在编译时存在,只需要在宏调用(调用)时存在。对于老古董来说,这个概念就像一个包含太多字段的邮件合并样板

宏变量可以是局部变量(作为宏定义中的一个参数,或在
%LOCAL
中明确说明,或作为对以前未定义符号的赋值。对全局宏变量的依赖应减少到最小或无,对调用方作用域中预期存在的变量的过度依赖也应如此。对全局变量的依赖应e在宏源代码中用
%GLOBAL
明确声明


对未声明的
%LOCAL
的赋值可能是一个问题,因为赋值可能会意外(意外)替换外部(或调用)中已声明或现有变量的值范围,以及它不正常工作的原因。良好的规则是显式地
%LOCAL
宏定义中的所有变量-宏系统没有严格的模式(如在其他语言中发现的)这会报告有问题的宏变量。

显示正在创建的宏变量PINCUK的唯一位置是在数据null步骤的末尾,但您在第一个数据步骤的前面引用了它。哪条语句导致了错误消息?开始时似乎所有内容都创建了日志错误,然后在第二次运行时它们都消失了。“表观符号引用未解析”和“语法错误,应为以下之一…”。。。"有没有办法创建一个宏变量,然后将其添加到上一个数据步骤中?如果没有,那可能就是我出错的地方。有没有办法创建一个宏变量,然后将其添加到上一个数据步骤中?只有使用时间机器。您可以使用
%LET
语句设置初始值。嗨,Richard,谢谢您的回复。我没有使用任何%SYMDEL语句,刷新后也可以使用。我猜我已经创建了一个宏变量,然后在代码中创建它之前尝试使用它,这是不可能的。我可以想象的唯一修复方法是让SAS扫描宏变量并首先创建它们,或者在开始时分组并运行它们。当我比如说随机顺序,我只是说我在整个代码中使用了宏变量,即使它们是在代码中进一步创建的。我也创建并使用了很多宏变量,这使得切换顺序变得很困难。