宏本身分为名称和内容两部分,类似于变量名和值。它可以分为两类:
- 局部宏 local macros
只能在给定的do file或一段交互的程序中使用 - 全局宏 global macros
在整个程序中都可以使用
这里先介绍局部宏( local macros)
local lclname [=exp | :extended_fcn | "[string]" | `"[string]"']
即局部宏后面可以跟
- 表达式
- 扩展函数
- “字符串”
- `"字符串"'(字符串中含双引号时用)
局部宏的调用方式:`local_macro_name'
注意:左边的引号是Tab键上方的,右边的引号是Enter键左侧的
*示例1
. local a 3+3
. local b=3+3
. disp `a'
. 6
. disp `b'
. 6
*示例2
. local a 3+3
. local b=3+3
. disp "`a'"
. 3+3
. disp "`b'"
. 6
*示例3
. local a "字符串"
. disp `a'
.字符串 not found //如果赋的值不是数值,则stata查找有无变量的名称为a,若有则输出该变量第一个观测值,反之报错提示找不到a变量。
*示例4
. clear
. set obs 10
. gen mycity = "Hangzhou"
. local a my
. local b city
. disp `a'`b'
. Hangzhou
*示例5
. local a "字符串"
. disp "`a'"
.字符串
*示例6
. local a `""字符"串"'
. disp `"`a'"'
"字符"串
*示例7
. local a 1
. disp `a'
1
. local b `a'+1
. disp `b'
2
*示例8
. local 1 2
. disp `1'
. 2
. local 2 10
. disp `2'
. 10
. disp ``1''
. 10
*示例10
. local x 1 3 5 7 9 100
. disp `x'
. 13579100
. end of do-file //出现“end of do-file”,表明离开子程序,此时再进行disp无内容显示,这体现了local局部变量的特征
. disp "`x'"
.
*示例11
. local problem = "3+3"
. disp `problem' //等价于 disp 3+3
.6
. disp `"problem"' //等价于 disp "problem"
.problem
. disp `"`problem'"' //等价于 disp `"3+3"'
.3+3
*示例12
. local problem = 3+3
. disp `problem' //等价于 disp 6
. 6
. disp `"problem"' //等价于 disp "problem"
. problem
. disp `"`problem'"' //等价于 disp `"6"'
. 6
局部宏的使用场景,如简化控制变量
local controls age agesq education income
reg outcome treatment `controls' //与下式等价
regress outcome treatment age agesq education income
此外,我们可以利用局部宏在程序结束后丢失的特点,建立临时变量、临时文件,一旦do文件结束,这些临时变量和临时文件就会自动被删除。
*临时变量
tempvar tempvarname
`tempvarname'
*临时文件
tempfile tempfilename
`tempfilename'
我们在处理数据时,有时需产生临时文件,最后还需要把临时文件删除,比较麻烦,此时就可以使用tempfile来处理,当程序结束时会自动删除这些文件。
tempfile master_data using_data
clear
input str12 id str4 year long price
"000001" "2002" 34
"000001" "2003" 71
"000002" "2002" 55
"000002" "2003" 25
"000004" "2002" 86
"000004" "2003" 44
end
save `master_data'
clear
input str13 id str4 year str12 name
"000001" "2002" "张三"
"000001" "2003" "张三"
"000001" "2004" "张三"
"000001" "2010" "张三"
"000002" "2002" "王五"
"000002" "2003" "王五"
"000002" "2004" "王五"
"000004" "2002" "李四"
"000004" "2003" "李四"
end
save `using_data'
use `master_data',clear
merge 1:1 id year using `using_data'
list