宏是Stata程序的变量,它用一个字符串(宏的名称)来代表另一个字符串(宏的内容)。宏分为局部宏(Local Macro)和全局宏(Global Macro)。局部宏只属于其所定义的程序,不能从其他程序中调用。而全局宏一旦被定义,就会留在内存中,且可以被其他程序使用。
局部宏的名称最多有31个字符,它的定义方式为:
local 宏的名称宏的内容
或:
local 宏的名称=表达式
例如,我们输入命令:
local nv"this is a newvar"
就定义了一个叫作nv的局部宏,其内容为this is a newvar。如果我们要引用这个局部宏的内容,其格式为:`nv'。注意,左边的引号为标准键盘左上角的重音符(数字1左边的键),右边的引号为通常的单引号。定义完毕之后,输入:
`nv'
也就相当于输入了:
this is a newvar
例如,我们可以输入如下命令来显示这个宏的内容:
display "`nv'"
注意,这里宏`nv'外面的双引号必不可少,因为如果不加引号,就相当于输入了如下命令:
display this is a newvar
Stata会显示错误提示:this not found。只有加上外面的双引号,才表示要显示一个字符串。否则,Stata会将其当作变量来处理。当然,如果宏的内容确实为存在的变量名,而我们要显示这个变量,就不必加上双引号。
对于定义局部宏的命令,宏内容上的引号可以省略。也就是说,我们在定义时,可以采用如下的命令:
local nv this is a newvar
这与前面是等价的。当然,加上引号能使命令的可读性更强。
下面来看一下定义宏的两种形式的区别。例如,对于如下两种形式:
local one 3+2 local two=3+2
在第1种形式中,局部宏`one'的内容为字符串3+2;而第2种形式中,Stata会先计算表达式的结果(3+2=5),然后将5保存到宏`two'中。在第2种形式中,表达式可以是数值表达式或字符串表达式。这里,3+2是数值表达式(如果想令其为字符串型,在外面加双引号就可以)。当然,我们也可以输入如下形式的字符串表达式:
local three=substr("this",1,2) + "at"
函数substr(x,a,b)的含义为:从字符串x的第a个字符开始,取b个字符。substr("this",1,2)就表示字符串"th"。这样,局部宏`three'的内容就是字符串"that"。
此外,还可以对宏进行计算。例如,输入命令:
local i=3 local i=`i'+2
其中,第1步定义了宏`i'的值为3,第2步将宏`i'的值增加为5(3+2)。注意第2步引号的位置。
局部宏(以及全局宏)也可以组合使用。例如,局部宏`i'为数值6,宏`x'为字符newvar,宏`x`i''就指代字符newvar6。另外,在组合时,我们可以通过大括号来设定运算的优先级。
如果要清除一个局部宏,那么可将其内容设置为空。可以通过如下3种方式实现:
①local macname
②local macname ""
③local macname = ""
这里,macname是指宏的名称。
而如果我们在程序中直接使用了一个没有被定义的宏,Stata就会将其当作一个内容为空的宏来处理。
对于全局宏而言,其名字最多可以有32个字符。全局宏的定义方法与局部宏类似,只需要将local改为global即可。此外,引用全局宏时,应在其名字前加上美元符号$。即便程序中的全局宏和局部宏有相同的名称也没有关系,因为它们的引用方法不同,Stata可以将其区分。
值得注意的是,如果我们要显示的内容的第1个字符为美元符号,为了和全局宏进行区分,我们可以在该字符前加上反斜线。例如:
display "\$that"
这就表示要显示字符串$that,而不是全局宏that的内容。