SAS:数组传递给宏

时间:2016-04-07 20:14:11

标签: sas sas-macro

我正在尝试使用宏来标记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相同。

有关可能发生的事情的任何建议?谢谢。

1 个答案:

答案 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更详细地解释了这一点。