第六章 程序
**6.1标准的程序文件
sysuse auto
, clear
summarize
log on
tab forei
log close
**6.2创造自己的命令:与stata相互问候
capture program drop hello
program hello
display “你好,兄弟”
// 注意此引号为中文输入
end
**6.3暂元
sysuse auto
, clear
list price length weight
in 1/5
local v3
"price length weight" //将 price length weight 这组字符赋给暂元名 v3
list `v3'
in 1/5
local cmd
"list" //将
list 这组字符赋给暂元名 cmd
`cmd
' `v3' in 1/5 //等价于
list price length weight
in 1/5
local pre
"pri" //将 pri 这组字符赋给暂元名 pre
`cmd
' `pre'
tab rep`
=26*3'
//等价于 tab rep78
, 注意到
26*3=78
*类似地可以使用
global 来定义暂元
sysuse auto
, clear
list price length weight
in 1/5
global v3
"price length weight" //将 price length weight 这组字符赋给暂元名 v3
list $v3
in 1/5 //等价于
list price length weight
in 1/5。
global cmd
"list" //将
list 这组字符赋给暂元名 cmd
$cmd $v3
in 1/5 //等价于
list price length weight
in 1/5
**Global 与 local 的区别
capt prog drop myprog
program myprog
//定义程序 myprog
local i
="主程序局域" //定义局域暂元 i
global j
="主程序全局" //定义全局暂元 j
di
as txt
"`i' " //调用局域暂元 i,这里是显示暂元名 i 中的内容“主程序局域”,绿色
di
as txt
"$j" //调用全局暂元 j,这里是显示暂元名 j 中的内容“主程序全局”,绿色
mysub
//执行子程序体 mysub
di
as error
"`i' " //再次调用局域暂元 i,显示暂元名 i 中的内容“主程序局域”
di
as error
"$j" //再次调用全局暂元 j,显示 “子程序全局暂元” ,红色
end
capt prog drop mysub
prog mysub
//定义子程序 myprog
local i
="子程序局域" //定义子程序中的局域暂元 i
global j
="子程序全局" //定义子程序中的全局暂元 j
di
as result
"`i'" //调用局域暂元 i,这里是显示暂元名 i 中的内容“子程序局域暂元”
di
as result
"$j" //调用全局暂元 j,这里是显示暂元名 j 中的内容“子程序全局暂元”
end
myprog
//执行主程序体 myprog
**6.4 自带命令参数
captu prog drop listargs
prog listargs
di
"第一个参数为: `1' "
di
"第二个参数为: `2' "
di
"第三个参数为: `3' "
di
"第四个参数为: `4' "
end
listargs
listargs I love stata
listargs
"I love stata" //区别
local i
"I love stata" //区别
listargs `i'
listargs this
is a test
listargs
"this is a test"
listargs
"this is" "a stata test" 5
**另一个办法是采用参数申明的方式。
captu prog drop listargs
prog listargs
args a b c d
di
"第一个参数为: `a' "
di
"第二个参数为: `b' "
di
"第三个参数为: `c' "
di
"第四个参数为: `d' "
end
listargs this
is a test
listargs
"this is a test"
**6.5 scale 标量
**
scalar a
=2 //赋予标量 a 的值为
2
dis a
+2 //a
+2=2+2=4
scalar b
=a
+3 //b
=a
+3=2+3=5
di b
//结果窗口显示出:
5
scalar s
=”hello”
//标量也可以为字符型
di s
//结果窗口显示出
: hello
clear
set obs
3
input a
1
3
5
end
scalar b
=3
gen v1
=a
*b
//回忆线性代数,该命令相当于对 a 的每个值乘 b
(即
3)
list
input b
2
3
4
end
gen v2
=a
*b
//注意 v1 与 v2 这两个命令完全相同
list //v1 与 v2 结果不同,表明 STATA 优先进行变量相乘
gen v3
=a
*scalar
(b
) //当 b 即是变量名又是标量名时,标量相乘时要指明标题
list
**
sysuse auto
, clear
sum price
return list //计算结果同时被存入到如下的标量中
local
sum=r
(sum) //将总和存入一个叫
sum 的暂元中
di `
sum'
**6.6 临时变量和临时数据文件
:tempvar 和 tempfile
*****
clear
set obs
5
tempvar x y
//指明临时变量名为 x 和 y
gen `x'
=_n
//生成临时变量`x’,取值为
1,2,3,4,5
gen `y'
=_N
//生成临时变量`y’,取值为
5,5,5,5,5
edit
//查看数据编辑器,却并没有变量
gen z
=`x
'+`y' //将两个临时变量相加,得到新变量 z
edit
//查看数据库,只有新变量 z
*****
use auto
, clear
preserve
//表明下面的操作将不破坏当前数据中的文件
keep price weight
//仅保留 price 和 weight 这两个变量
save master
, replace
//保存新数据文件 master,该数据包含两个变量
drop weight
//再去掉变量 weight,当前数据中只剩一个变量 weight
save part1
,replace
//保存新数据文件 part1,该数据包含一个变量
use master
, clear
drop price
rename weight price
append using part1
erase master
.dta
erase part1
.dta
restore
//回到 preserve 命令之前的数据集,即 auto
******
/*这是一个坏程序,因为中间性数据文件 master 和 part 并不是我们想要的,即使最后有 erase
命令将其删除,一旦在此前强行退出,仍会导致这两个不必要的文件占用空间并造成混乱。
*/
******
preserve
keep price weight
tempfile master part1
save “`master’”
drop weight
save “`part1’”
use “`master’”
, clear
drop price
rename weight price
append using “`part1’”
restore
/*在这种情形下,无论是出现运行错误还是中途中止,都不会破坏原数据文件,也不会产生
垃圾文件。
*/