我正在尝试使用宏来标记SAS中的一些数组变量,以避免键入大量代码行。我想要做的基本上是这样的:
%macro LABEL_ARRAY(V);
%DO I = 1 %TO 4;
%let variablename=&V(&I);
array1[&I] = "Value of &variablename"
%END
%MEND LABEL_ARRAY;
因此,V是一个数组,包含数组array1中位置的相应变量名。我试图为每个数组和多个数组提供超过4个变量,但这是基本的想法。基本上发生的事情是array1 [& I],我想最终说第一个条目的array1 [1],不使用I的值,而只是说& I,与& variablename相同。
有关可能发生的事情的任何建议?谢谢。
答案 0 :(得分:2)
在SAS中,宏语言中没有内置数组类型(宏语言实际上根本没有类型)。
宏数组通过多种分辨符来处理。我建议您阅读this answer,了解更多信息,了解其在一般情况下的确切运作方式。
但是,对于宏变量"数组"的具体情况,有必要准确解释它们是如何工作的。
你所拥有的可能是一组像这样的宏变量:
%let v = Color;
%let color1=Blue;
%let color2=Red;
%let color3=Green;
你希望能够做到:
%do _i = 1 to 3;
%let thisColor = &color&_i;
%end;
除非它不起作用 - 因为&color
已解决(如果您没有单独定义taht,可能会解析为&color
),而&i
会解析为{ {1}},留下1
但&color1
,以及Blue
未解决的警告讯息。
您需要做的是延迟&color
的解决方案,直到&color
结算。您可以通过添加第二个&符号来实现。
&_i
它的作用是告诉SAS将两个%do _i = 1 to 3;
%let thisColor = &&color&_i;
%end;
解析为一个&&
,但将其保留在队列中以便解析;然后在第二遍,解决单&
。你有
&
而不是停留在第二级。
我的论文Unravelling the Knot of Ampersands和Ron Fehd的Array: Construction and Usage of Arrays of Macro Variables更详细地解释了这一点。