2013-10-25 56 views
0

我正在使用名爲flow的.ado文件。如果用戶鍵入flow i我想要一個if語句運行。如果用戶鍵入flow e,我希望另一個if語句運行。Stata:Ado文件語法

我該怎麼做?

回答

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 

因爲我們已經建立的用戶輸入ei最後if條件是多餘的。根據口味編輯它。

+0

謝謝,我試過''語法[,ie]'但它顯然沒有做任何事情 – Parseltongue

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 

之後,你叫flow這樣的:flow, iflow, e。注意逗號,現在這是必要的(但不是@NickCox的命令),因爲你讓它們成爲選項。

+0

我的代碼與此非常相似,但是「E」和「I」總是在運行而不管流查詢,我無法弄清楚爲什麼。不過,你的代碼有效。謝謝! – Parseltongue

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命令都附帶一個幫助文件。一些程序員在假設幫助文件解釋語法的前提下編寫;其他人希望他們的錯誤消息儘可能有幫助。