全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
9996 43
2010-01-31
以下代码仅供例示:

cap prog drop test
prog define test
  clear all
  args t1 t2
  local i=`t2'-`t1'
  set obs `i'
  gen x=`t1'*`t2'
  save test.dta
end

如何使用syntax语法命令控制t1和t2,使得(1)t2必须大于t1,且(2)t1、t2须为正,最后(3)还允许加上选项以控制是否保存数据,如: test 1 5 默认保存数据文件,而 test 1 5, nosave 则不保存?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-1-31 16:57:37
*! Given by Yu-Jun Lian   arlionn@163.com
*! 2010.01.31
cap program drop test
program define test
version 10
syntax anything [, Nosave Filename(string)]
  clear
  local s : word count `anything'
  if `s'!=2{
    dis as error "Only two numbers can be specified!"
    exit
  }
  tokenize `anything'
  if `1'<0|`2'<0{
    dis as error "the numbers must be positive!"

    exit
  }
  if `1'>=`2'{
    dis as error "the numbers must be in ascending ordering!"
    exit
  }
  local i = `2' - `1'
  set obs `i'
  gen x = `1'*`2'
  if "`filename'" == ""{
    local filename "test"
  }
  if "`nosave'" == ""{
    save `filename'.dta, replace
  }
end



测试结果:

. test 10 20 30
Only two numbers can be specified!

. test 10
Only two numbers can be specified!

. test 10 5
the numbers must be in ascending ordering!

. test 10 50, file(mytest)
obs was 0, now 40
(note: file mytest.dta not found)
file mytest.dta saved
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-1-31 17:48:19


呵呵,可做为编程标准范例
另外,可以限定anything为数值型吗?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-1-31 18:02:06
看看 assert 命令的帮助,附加如下语句

qui cap assert sqrt(`1')!=.
if _rc {
   dis as error "the input must be numeric!"
}
qui cap assert sqrt(`2')!=.
if _rc {
   dis as error "the input must be numeric!"
}
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-2-1 08:43:13
*若把两个数字放入必选项中,可省略几行(但输入命令时要多输入几个字符);另外控制了不能同时输入ns与s:
cap pr drop ntest
pr ntest
qui{
  clear all
  syntax ,n(numlist >0 asc min=2 max=2) [ns s(str)]
  if "`ns'"!=""&"`s'"!=""{
    n di as error "ns and s should not be input together"
    exit
  }
  token `n'
  local i=`2'-`1'
  set obs `i'
  gen x=`1'*`2'
  if "`ns'"==""{
    if "`s'"!="" save `s',replace
    else save test,replace
  }
}
end
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-2-1 10:56:15
sungmoo 发表于 2010-2-1 08:43
*若把两个数字放入必选项中,可省略几行(但输入命令时要多输入几个字符);另外控制了不能同时输入ns与s:
cap pr drop ntest
pr ntest
qui{
  clear all
  syntax ,n(numlist >0 asc min=2 max=2) [ns s(str)]
  if "`ns'"!=""&"`s'"!=""{
    n di as error "ns and s should not be input together"
    exit
  }
  token `n'
  local i=`2'-`1'
  set obs `i'
  gen x=`1'*`2'
  if "`ns'"==""{
    if "`s'"!="" save `s',replace
    else save test,replace
  }
}
end
楼上代码形成如:ntest, n(1 8) s(test)  的命令格式
如果能改成这种格式:ntest 1 8, s(test)  就更好了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群