2016-04-07 117 views
2

我想用宏来标记SAS中的一些数组变量,以避免输入大量的代码行。我正在试图做的基本上是这样的:SAS:数组传递给宏

%macro LABEL_ARRAY(V); 
%DO I = 1 %TO 4; 
    %let variablename=&V(&I); 
    array1[&I] = "Value of &variablename" 
%END 
%MEND LABEL_ARRAY; 

因此,V是包含在阵列阵列1的位置对应的变量名的数组。我试图为每个数组和多个数组使用4个以上的变量,但这是基本思想。基本上发生了什么是array1 [&我],我想最终说第一个条目array1 [1],不使用我的值,而只是说&我,与& variablename同样的事情。

关于可能发生什么的任何建议?谢谢。

+0

你可以尝试%let variablename =&&V(&I);看看这是否可行,但我怀疑不是。实际上将它改为:%let variablename = &&V&I;并且应该可以工作 – DCR

+0

我对你想要的东西感到困惑。你可以展示一个使用你的宏的数据步骤吗?你说你想标注变量,但没有LABEL语句。如你所说,Array1 [&i]将解析为array1 [1]。 &Variablename不会解析为变量名称。您可能想看看VNAME功能。但是你不能使用数据步骤数组来分配变量标签。 – Quentin

+0

@Quentin想必这样做会生成一堆标签语句,然后像'label%label_array(v);' – Joe

回答

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,而您将使用&color1而不是Blue,并附加关于的警告消息0没有解决。

你需要做的是延迟&color的分辨率,直到&_i解决。您可以通过添加第二个&符号来实现。

%do _i = 1 to 3; 
    %let thisColor = &&color&_i; 
%end; 

什么,做是告诉SAS解决的两大&&一个&但将其保留在队列中解决;然后第二遍,解决那个单一的&。所以你有

&&color&_i 
&color1 
Blue 

而不是停在第二级。

这在我的论文Unravelling the Knot of Ampersands和Ron Fehd的Array: Construction and Usage of Arrays of Macro Variables中有更详细的解释。

+0

除此之外,我鼓励您考虑使用宏变量数组的替代方法,因为通过数据驱动编程(google SAS +)可以更轻松地完成这些任务。 – Joe

+0

哇,谢谢@Joe,这一切都非常有帮助! – kyro1021