Stata:Ado文件语法

时间:2013-10-25 09:25:26

标签: stata

我正在使用名为flow的.ado文件。如果用户键入flow i,我希望运行一个if语句。如果用户键入flow e,我希望运行另一个if语句。

我该怎么做?

3 个答案:

答案 0 :(得分:3)

此论坛的许多读者希望看到您尝试的一些代码....

program flow 
    version 8  // will work on almost all Stata in current use 
    gettoken what garbage : 0 
    if "`what'" == "" | "`garbage'" != "" | !inlist("`what'", "e", "i")  { 
       di as err "syntax is flow e or flow i"
       exit 198 
    }

    if "`what'" == "e" { 
       <code for e>
    }
    else if "`what'" == "i" { 
       <code for i>
    } 
end 

最后一个if条件是多余的,因为我们已经确定用户已键入ei。根据口味编辑出来。

答案 1 :(得分:2)

鉴于你对@NickCox的答案发表评论,我认为你尝试过这样的事情:

program flow
    version 8
    syntax [, i e]
    if "`i'`e'" == "" {
        di as err "either the i or the e option needs to be specified"
        exit 198
    }
    if "`i'" != "" & "`e'" != "" {
        di as err "the i and e options cannot be specified together"
        exit 198
    }
    if "`e'" != "" {
        <code for e>
    }
    if "`i'" != "" {
        <code for i>
    }
end

之后,您可以这样致电flowflow, iflow, e。注意逗号,现在这是必要的(但不是@NickCox的命令)因为你做了选项。

答案 2 :(得分:1)

如果您希望ie是互斥选项,那么这是另一种选择:

 program flow
    version 8
    capture syntax , e 

    if _rc == 0  { // syntax matched what was typed 
        <code for e>
    }
    else {
        syntax , i // error message and program exit if syntax is incorrect
        <code for i>
    }
end

如果每个分支中的代码都很长,那么很多人会更喜欢每个案例的子程序作为一种好的风格,但这与这里的草图一致。请注意,在每个syntax语句中,该选项都是强制性的。

capture的效果是:错误不是致命的,而是由capture“吃掉”。因此,您需要查看可在_rc中访问的返回码。 0 _rc总是表示命令成功。非零始终表示命令不成功。在这里,通常在其他地方,命令只有两种方法是正确的,所以我们不需要知道_rc是什么;我们只需要检查其他合法语法。

请注意,即使我的两个答案在风格上也不同,用户输入非法命令是获取信息性错误消息还是只是“无效语法”。对此的上下文是期望每个Stata命令都附带一个帮助文件。一些程序员假设帮助文件解释了语法;其他人希望他们的错误消息尽可能有用。