2014-10-08 79 views
2

我有一个程序,我想运行几年。因此,在一段时间内我必须选择我的数据SAS调用一个宏变量

data want; 
    set have(where='2014'); 
    run; 

试穿好几年了,我有一个宏变量,我定义为

%let an=14 
/*It is 14 and not 2014, because elsewhere I need it that way.*/ 

但后来当我试图把它放在我的程序不会在所有

data want; 
    set have(where="&&20&an."); 
    run; 

工作,我将不胜感激一些帮助

首先编辑:变化d'为“”,但仍然无法正常工作

第二个编辑,并回答

“20 &的”

+2

宏变量解决双引号,你可能只需要“20&an”。一部分。 – Reeza 2014-10-08 10:21:18

+0

感谢您的提示,它与“20&an”一起工作。 但是,如果不适用于“&& 20&an”。 我很高兴它的工作,但如果你知道为什么其他不这样做,我会高兴地采取解释 – 2014-10-08 10:27:52

+1

&符主要用于解决宏变量。对于20&an,&an解析为14,所以当与20合并时,您获得2014. && 20&an变为&2014,但没有宏变量2014,这就是为什么&& 20&an不起作用。 – Amir 2014-10-08 11:23:55

回答

3

你到达答案(20&an)是正确的 - 你都设置。你甚至不需要阅读我已发布的这个答案的其余部分:-)

但是我注意到你对&&&有点困惑。如果您想了解更多信息,可以在SAS宏观评估中汇总一些关于&&&之间的差异以及&&的目的的额外信息。

&是最常见的符号 - 您只需使用它来评估/取消引用变量。所以:

%LET an = 14 ; 
%PUT ----- an ; 
%PUT ----- &an ; 

输出:

----- an 
----- 14 

因此,大家可以看到,你必须把&变量名的前面,以去参考它的价值。省略&只是打印字符串an,在这种情况下恰好是变量的名称。对于大多数宏编码,&是你永远需要的。 &在SAS宏像贝壳,*用C $


现在,什么是&&呢?它的存在使您能够拥有动态的宏变量名称。也就是说,有一个宏变量,其值是另一个宏变量的名称。如果你熟悉C语言,你可以把它看作是指向指针的指针。

SAS评估&&的方式分两次进行。在第一遍中,它将&&转换为&。同时,它在该通道中看到的任何符号将被用于取消引用它们旁边的变量名称。这个想法是为了将这些后面的表达式解析成一个变量名。然后,在第二遍中,剩余的&符号(全部为原始&&符号)将取消引用它们现在发现自己旁边的任何变量名称。

这里是一个示例输出的例子:

%LET x = 3; 
%LET name_of_variable = x; 

%PUT ----- &x; 
%PUT ----- &&name_of_variable; 
%PUT ----- &&&name_of_variable; 

输出:

----- 3 
----- x 
----- 3 

在第一%PUT,我们只是使用普通的旧&,因此,我们在做什么,我们以前那样,读取并打印x所保存的值。在第二个%PUT,事情变得更有趣。由于&&,SAS做了两次评估。第一个转变是:

%PUT ----- &&name_of_variable; 

对此

%PUT ----- &name_of_variable; 

在第二遍,SAS做标准&评价打印name_of_variable保存的值 - 串x,这恰好是我们正在使用的另一个变量的名称。当然,这个例子是特别设计的:当你可以写&name_of_variable时,为什么你会写&&name_of_variable

在第三个%PUT,我们现在有&&&,SAS做了两遍。这里是我们最终看到&&真实目的的地方。我将把表达的部分放在圆括号中,以便你可以看到它们是如何评估的。我们从这个去:

%PUT ----- (&&)(&name_of_variable); 

要这样:

%PUT ----- &x; 

所以在第一遍时,&&转化为&,并且&name_of_variable是的name_of_variable一个简单的去参照,评估到它所持有的内容,正如我们所说的是x

所以在第二次,我们只是留下了简单的评价:

%PUT ----- &x; 

正如我们所设定x等于3,这个计算结果为3

因此,在某种意义上说&&&name_of_variable在说“向我显示名称存储在name_of_variable.中的变量的值”

这是您为什么要这么做的一个激励性示例。假设您有一个简单的宏子程序,它将一个任意数字添加到存储在SAS宏变量中的数值中。为此,子程序必须知道要添加的数量,但更重要的是,它需要知道要添加的变量的名称。你会通过&&机制实现这种动态的变量命名,比如:

%MACRO increment_by_amount (var_name = , amount =); 
    %LET &var_name = %EVAL (&&&var_name + &amount) ; 
    /* Note: this could also begin with %LET &&var_name = .... */ 
%MEND; 

这里我们说:“让他的名字在举行var_name(即&var_name)等于可变的,其名称是值的变量持有var_name(即&&&var_name)加上amount(即&amount)中的值。

当您调用像这样的子程序时,请确保您传递变量名称,而不是值。也就是说,这样说:

%increment_by_amount (var_name = x , amount = 3); 

不是这个:

%increment_by_amount (var_name = &x , amount = 3); 

所以调用的一个例子是:

%LET x = 3; 
%PUT ----- &x; 
%increment_by_amount (var_name = x , amount = 3); 
%PUT ----- &x; 

输出:

----- 3 
----- 6 
+1

明天睡觉后我会明天再读它(对我来说,这一天的结束),但非常感谢! – 2014-10-08 14:06:41

+0

随时。我听说你睡着了! – 2014-10-08 14:07:15

+1

非常清楚和有益的thx。 我很高兴我的标题是那么模糊,它可能会让其他人找到你清晰有用的答案! – 2014-10-09 09:46:23