我是sas语言的新学习者。我知道这对你来说很容易。我只是想了解它如何使用宏变量。实际上,我只需要正确运行一个sas程序。我有两个marco变量 &安培; X = 12,20,40,77 &安培; Y = 12,45,54,78
我只需要计算它们的最大值和最小值。所以我写下这段代码:
%let &x=12 20 40 77;
%let &y=12 45 54 78;
%put max min (&&x);
%put max min (&&y);
它向我显示了这个错误:
检测到开放代码语句递归
我试图找到解决方案,但它不起作用!请如何解决?
答案 0 :(得分:0)
请参阅此link
我试着这样做。
string t;
if (x == 1) {
t = "case 1";
} else if (x == 2) {
t = "case 2";
} else if (x == 3) {
t = "case 3";
} else {
t = "other case";
}
我希望它有所帮助。
答案 1 :(得分:0)
要收到您收到的错误,您可能会混淆SAS。您发布的代码会产生以下错误:
WARNING: Apparent symbolic reference X not resolved.
ERROR: Expecting a variable name after %LET.
1 %let &x=12 20 40 77;
2 %let &y=12 45 54 78;
WARNING: Apparent symbolic reference Y not resolved.
ERROR: Expecting a variable name after %LET.
3 %put max min (&&x);
WARNING: Apparent symbolic reference X not resolved.
max min (&x)
4 %put max min (&&y);
WARNING: Apparent symbolic reference Y not resolved.
max min (&y)
在第一个语句中,您尝试使用宏变量X的值作为宏变量的名称来创建宏变量。但是从未定义过X,因此&X
刚刚解析为&X
。由于&
不是在宏变量名称中使用的有效字符,因此最终会生成无效的%let
语句。
如果我们修复前两个语句以便它们生成有效的%LET
语句,那么代码就会运行。目前尚不清楚您希望它做什么,但它可以像SAS那样运作。
5 %let x=12 20 40 77;
6 %let y=12 45 54 78;
7 %put max min (&&x);
max min (12 20 40 77)
8 %put max min (&&y);
max min (12 45 54 78)
&
语句中的额外%put
只是让SAS必须通过两遍才能解析宏变量引用。第一遍将解析&&
到&
并触发宏处理器再次传递。然后第二遍将正确解析结果&x
到字符串12 20 40 77
。
最好使用SAS代码而不是宏代码处理数字。如果要使用MAX()函数找到数字列表的最大值。通常,当您使用空格分隔值但只能使用变量名而不是文字值时,可以在数据步骤中使用OF
关键字。所以将空格更改为逗号。
9 %put &=x ;
X=12 20 40 77
10 data _null_;
11 max=max(%sysfunc(translate(&x,%str(,),%str( ))));
12 put max=;
13 run;
max=77
如果您真的只想使用宏语言,请再次使用%SYSFUNC()
函数调用MAX()
函数。
14 %put max=%sysfunc(max(%sysfunc(translate(&x,%str(,),%str( )))));
max=77