SAS宏引用未解析
我的代码中有宏,它们是按随机顺序创建和使用的 它显示“%put&pincuk”的“reference not resolved”,以及“&pincuk”的语法错误。当我运行两次代码时,它工作正常。我猜它发生在SAS在宏创建之前到达&pincuk时。比如说,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
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扫描宏变量并首先创建它们,或者在开始时分组并运行它们。当我比如说随机顺序,我只是说我在整个代码中使用了宏变量,即使它们是在代码中进一步创建的。我也创建并使用了很多宏变量,这使得切换顺序变得很困难。